سؤال

في العديد من أمثلة C++ أرى استخدامًا للنوع size_t حيث كنت سأستخدم int بسيطًا.ما الفرق، ولماذا يجب أن يكون size_t أفضل؟

هل كانت مفيدة؟

المحلول

من ويكيبيديا الصديقة:

تحدد ملفات الرأس stdlib.h وstddef.h نوع بيانات يسمى size_t والذي يستخدم لتمثيل حجم الكائن.تتوقع وظائف المكتبة التي تأخذ الأحجام أن تكون من النوع size_t، ويتم تقييم عامل التشغيل sizeof إلى size_t.

النوع الفعلي لـ size_t يعتمد على النظام الأساسي؛من الأخطاء الشائعة افتراض أن size_t هو نفس unsigned int، مما قد يؤدي إلى أخطاء برمجية، خاصة مع انتشار بنيات 64 بت.

تحقق أيضًا لماذا يهم size_t

نصائح أخرى

وsize_t هو النوع الذي يستخدم لتمثيل الأحجام (كما تشير أسماء لها). برنامجه (وحتى يحتمل التنفيذ) يعتمد، وينبغي أن تستخدم فقط لهذا الغرض. من الواضح، وهو ما يمثل حجم، size_t غير الموقعة. العديد من الوظائف stdlib، بما في ذلك malloc، وظائف تشغيل سلسلة sizeof ومختلف استخدام size_t بمثابة نوع البيانات.

ويتم التوقيع على عدد صحيح افتراضيا، وعلى الرغم من حجمه أيضا منصة تعتمد، وسوف يكون 32bits ثابتة على معظم الآلات الحديثة (وعلى الرغم من size_t هو 64 بت على معمارية 64 بت، تبقى كثافة 32bits طويلة على تلك البنى ).

لتلخيص: استخدام size_t لتمثيل حجم كائن وكثافة العمليات (أو طويلة) في الحالات الأخرى

وانها لsize_t يمكن أن يكون أي شيء آخر من عدد صحيح (ربما البنية). والفكرة هي أنه يفصل انها وظيفة من نوع الأساسي.

ويتم تعريف نوع size_t كنوع يتجزأ غير موقعة من المشغل sizeof. في العالم الحقيقي، وسوف كثيرا ما نرى int يعرف بأنه 32 بت (للتوافق مع الإصدارات السابقة) ولكن size_t يعرف بأنه 64 بت (حتى تتمكن من إعلان المصفوفات وهياكل أكثر من 4 بنك الخليج الدولي في الحجم) على منصات 64 بت. إذا كان long int هو أيضا 64 بت، وهذا ما يسمى اتفاقية LP64. إذا long int هو 32 بت ولكن long long int والمؤشرات و64 بت، وهذا LLP64. يمكنك أيضا قد تحصل على العكس، وهو البرنامج الذي يستخدم تعليمات 64 بت للسرعة، ولكن مؤشرات 32 بت لحفظ الذاكرة. أيضا، تم توقيع int وsize_t غير الموقعة.

وكانت هناك تاريخيا عددا من منصات أخرى حيث كانت عناوين أوسع أو أقصر من الحجم الأصلي للint. في الواقع، في '70s و مبكر' '80S، وكان هذا أكثر شيوعا من لا: كان جميع شعبية الحواسيب الصغيرة 8 بت سجلات 8 بت وعناوين 16 بت، والانتقال بين 16 و 32 بت أنتج أيضا العديد من الآلات التي كان عناوين أوسع من سجلاتها. أنا أحيانا لا تزال ترى الأسئلة هنا حول بورلاند توربو C ل MS-DOS، الذي وضع ذاكرة ضخمة وعناوين 20 بت المخزنة في 32 بت على وحدة المعالجة المركزية 16 بت (ولكن التي يمكن أن تدعم مجموعة التعليمات 32 بت من 80386)؛ كان موتورولا 68000 لALU 16 بت مع سجلات 32 بت وعناوين. كان هناك كبيرة IBM مع وعناوين 24 بت أو 31 بت 15 بت. أنت أيضا لا تزال ترى مختلفة ALU وعنوان حافلة الأحجام في النظم المضمنة.

وأي وقت int أصغر من size_t، ومحاولة تخزين حجم أو إزاحة ملف كبير جدا أو كائن في unsigned int، هناك احتمال أنه يمكن أن تجاوز وتسبب خلل. مع int، وهناك أيضا إمكانية الحصول على رقم سالب. إذا كان int أو unsigned int هو أوسع، سيتم تشغيل البرنامج بشكل صحيح ولكن الذاكرة النفايات.

ويجب عموما استخدام النوع الصحيح لهذا الغرض إذا كنت تريد قابلية. وهناك الكثير من الناس ننصح باستخدام الرياضيات وقعت بدلا من غير موقعة (لتجنب سيئة، والبق خفية مثل 1U < -3). لهذا الغرض، وتعرف المكتبة القياسية ptrdiff_t في <stddef.h> كنوع موقعة من نتيجة طرح مؤشر من آخر.

وقال ان الحل قد يكون في حدود-فحص جميع العناوين وإزاحة ضد INT_MAX وإما 0 أو INT_MIN حسب الاقتضاء، وبدوره على تحذيرات مترجم عن تقارن الموقعة وغير الموقعة كميات في حال كنت تفوت أي. يجب عليك دائما، دائما، دائما فحص مجموعة الخاص بالوصول لتجاوز في C على أي حال.

تعريف SIZE_T موجود في:https://msdn.microsoft.com/en-us/library/cc441980.aspx و https://msdn.microsoft.com/en-us/library/cc230394.aspx

لصق هنا المعلومات المطلوبة:

SIZE_T هو ULONG_PTR يمثل الحد الأقصى لعدد البايتات التي يمكن أن يشير إليها المؤشر.

يتم الإعلان عن هذا النوع على النحو التالي:

typedef ULONG_PTR SIZE_T;

أ ULONG_PTR هو نوع طويل غير موقع يستخدم لدقة المؤشر.يتم استخدامه عند إرسال مؤشر إلى نوع طويل لإجراء حساب المؤشر.

يتم الإعلان عن هذا النوع على النحو التالي:

typedef unsigned __int3264 ULONG_PTR;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top