هو حجم المحمولة؟
-
18-09-2019 - |
سؤال
دول مجلس التعاون الخليجي 4.4.1، C99
انا استخدم size_t
, ، و size_t
هو unsigned int
. وبعد ومع ذلك، هذا يعتمد إذا كنت تقوم بتشغيل 32 بت أو 64 بت.
سوف أستخدم size_t
لتخزين حجم المخزن المؤقت.
لذلك لا أعتقد أن هذا سيكون محمولا للغاية إذا كنت تستخدم عبر الهندسة.
مجرد سؤال، مع استخدام size_t
على أي 32 أو 64 بت. ما هي الحالات التي سيؤدي إليها مشكلة أخطر؟
المحلول
size_t
مضمون لتكون قادرة على عقد عدد البايتات من أي كائن في تنفيذك. لهذا السبب نوع العودة من sizeof
يكون size_t
.
نعم، إنه محمول.
نصائح أخرى
كما قال آخرون، size_t
هو الصحيح ومقبول تماما لتخزين نتيجة sizeof()
أو حجم أي كائن تمثل في بايت. ما عليك ان تراقبه هو ما يلي:
size_t
هو نفس حجم نوع عدد صحيح غير موقعة. وبعد ليس بالضرورة نفس عدد البايتات باعتبارها أكبر نوع عدد صحيح غير موقعة،unsigned int
,unsigned long
, ، إلخ.sizeof(size_t)
هو عدد محدد من التنفيذ من البايتاتmemcpy
"جي أو تعيين في أي نوع عدد صحيح غيرuintmax_t
هي فكرة سيئة. أنا لست متأكدا من أنه من الآمن افتراض أن ذلك متساويا أو أصغر منuintmax_t
.- كتابة
size_t
قيمة إلى ملف ثنائي وقراءة ذلك مرة أخرى إلىsize_t
من خلال عملية أخرى، على آلة مختلفة، أو عن طريق شيء مترجم مع خيارات مترجم مختلفة يمكن أن تكون خطرة على صحتك. - إرسال أ
size_t
القيمة عبر الشبكة ومحاولة استلامها باستخدامsizeof(size_t)
المخزن المؤقت على الجانب الآخر غير آمن بالأحرى.
كل هذه المشكلات القياسية مع أي نوع عدد صحيح آخر باستثناء unsigned char
. وبعد وبالتالي size_t
هو فقط المحمولة مثل أي نوع عدد صحيح آخر.
يجعل من المنطقي استخدام Size_t أو ssize_t للحصول على مخزن مؤقت إذا كنت تستخدم Malloc () أو قراءة (). بالنسبة لإصلاح قابلية استخدام Size_Max، SSIZES_MAX، SIFEOF (نوع في المخزن المؤقت الخاص بك) و٪ ZD أو٪ ZU Printf ().
لقد حصلت أيضا على OFF_T و PTRDIFF_T / SSIZE_T، والتي تختلف بين الهندسة بنفس الطريقة.
إذا كنت تستخدمها بشكل صحيح، فهي محمولة عبر الهندسة. على نظام 32 بت، سيكونون جميعا 32 بت واسعة، بينما على نظام 64 بت سيكون كل 64 بت. هذا هو ما تريده - لا يمكن أن يكون حجم المخزن المؤقت أكبر من حجم 32 بت على نظام 32 بت، ولكن يمكن أن يكون أكبر بكثير على نظام 64 بت.
يجب ألا تستخدم Ints، والرجاء، أو أي شيء آخر. بصرف النظر عن أي شيء آخر، فإن حجم الاختلاف الطويل اعتمادا على المنصة (32 بت في معظم أنظمة 32 بت، 64 بت من أنظمة يونيكس 64 بت، 32 بت على Windows 64 بت).
من الصعب معرفة ما تقصد به "المحمولة" في هذه الحالة. يسمح مصطلح "المحمولة" بتفسيرات متعددة مختلفة بسهولة.
اكتب size_t
لديه غرض محدد جدا. يمكن أن يحمل حجم أي كائن في التنفيذ المحدد. أي أنه نوع يمكن أن يحصل دائما على نتيجة sizeof()
المشغل أو العامل. اكتب size_t
لا يوجد لديه غرض آخر، وداخل تطبيقه المقصود هو 100٪ المحمولة، كما هو محمول مثل أي شيء يمكن أن يكون.
أي نوع من "المحمولة" التي تسأل عنها هي، مرة أخرى، غير واضحة.
يجب أن لا تفترض أن Size_t هو int غير موقعة (انظر هذه الإجابة)، لكنني أعتقد أنه يحتوي على نفس النطاق في كلا البصريين.
يعتمد على ما تستخدمه Size_t ل.
إذا كنت تستخدمه لتحديد حجم المخزن المؤقت ذاكرة، فسيكون ذلك آمنا، نظرا لأن Size_T كبير بما يكفي لمعالجة الذاكرة بأكملها من أي جهاز كمبيوتر. لذلك إذا كان المخزن المؤقت الذاكرة أكبر من ذلك، فلديك مشكلة على أي حال.
من ناحية أخرى، إذا كنت تستخدمها كعادا صحيحا غير ميزي لعدد عدد النجوم في الكون على سبيل المثال، فقد تواجه مشكلة في نظام 32 بت (غير متأكد من أنظمة 64 بت).
المشكلة الخطيرة الحقيقية الوحيدة مع هذا تحاول الوصول إلى مجموعة كبيرة إلى حد ما أو عدد كبير من أجل Size_T.
تماما مثل مجرد "INT" العادية قد يكون كافيا على 64 بت، ولكن قد يتسبب في تعطل على 32 بت لأنها كبيرة جدا بالنسبة إلى INT على نظام 32 بت.