ما الفرق بين size_t و int في C++؟
سؤال
في العديد من أمثلة 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;