ما هي أنواع POD في C++؟




types c++-faq (5)

غير رسمي جدا:

POD هو نوع (بما في ذلك الفئات) حيث يضمن مترجم C ++ أنه لن يكون هناك "سحر" يجري في البنية: على سبيل المثال مؤشرات مخفية إلى vtables ، الإزاحات التي يتم تطبيقها على العنوان عند إرسالها إلى أنواع أخرى ( على الأقل إذا كان الهدف POD أيضا ، أو المنشئات ، أو destructors. بشكل عام ، النوع هو POD عندما تكون الأشياء الوحيدة فيه هي أنواع مدمجة ومجموعات منها. والنتيجة هي شيء "يتصرف مثل" نوع C.

أقل بشكل غير رسمي:

  • int ، char ، wchar_t ، bool ، float ، double are PODs، as long/short and signed/unsigned منهم.
  • المؤشرات (بما في ذلك مؤشر إلى وظيفة ومؤشر إلى عضو) هي PODs ،
  • enums هي PODS
  • const أو volatile POD هو POD.
  • class أو هيكل أو union PODs هو POD بشرط أن يكون جميع أعضاء البيانات غير الاستاتيكية public ، ولا يحتوي على فئة أساسية ولا منشئات أو destructors أو طرق ظاهرية. لا يوقف الأعضاء الساخرون شيئًا يكون POD بموجب هذه القاعدة.
  • Wikipedia من الخطأ أن نقول أن POD لا يمكن أن يكون أعضاء من نوع مؤشر إلى عضو. أو بالأحرى ، هذا صحيح لصياغة C ++ 98 ، لكن TC1 صرحت بأن المؤشرات إلى عضو هي POD.

رسميا (C ++ 03 Standard):

3.9 (10): "الأنواع الحسابية (3.9.1) ، وأنواع العد ، وأنواع المؤشر ، ومؤشر أنواع الأعضاء (3.9.2) والإصدارات المؤهلة cv من هذه الأنواع (3.9.3) هي أنواع عددي متسلسلة جماعية. الأنواع ، وأنواع POD-struct ، وأنواع POD-union (المادة 9) ، صفائف مثل هذه الأنواع والنسخ المؤهلة cv من هذه الأنواع (3.9.3) تسمى بشكل جماعي أنواع POD "

9 (4): "إن بنية POD هي فئة تجميعية لا يوجد بها أعضاء بيانات غير ثابتين من النوع غير-POD-struct أو غير POD-union (أو صفيف من مثل هذه الأنواع) أو مرجع ، وليس له مستخدم- تعريف مشغّل النسخ وبدون هوية مدمّرة من قبل المستخدم. وبالمثل ، يُعدّ اتحاد POD اتحادًا تجميعيًا لا يحتوي على أعضاء بيانات غير ثابتين من النوع غير المنبثق ، أو اتحاد غير قابل للنفاذ (أو مجموعة من هذه الأنواع) أو مرجع ، وليس لديه مشغل نسخة تعريف المستخدم ولا destructor المعرفة من قبل المستخدم.

8.5.1 (1): "التجميع هو مصفوفة أو فئة (بند 9) مع عدم وجود مُنشِئين مُعلنين من قِبل المستخدم (12.1) ، لا يوجد أعضاء بيانات خاصين غير مستقلين أو محميين (المادة 11) ، لا توجد فصول أساسية (المادة 10) ولا توجد وظائف افتراضية (10.3). "

لقد صادفت هذا المصطلح POD- نوع عدة مرات. ماذا تعني؟


سيتم إهمال مفهوم POD و نوع std::is_pod في C ++ 20. انظر this السؤال لمزيد من المعلومات.


مع C ++ ، لا تعني Plain Old Data أن الأشياء مثل int ، char ، إلخ هي الأنواع الوحيدة المستخدمة. تعني "البيانات القديمة السهلة" في الواقع أنه يمكنك من الناحية العملية أخذ memcpy هيكلي من موقع واحد في الذاكرة إلى آخر ، وستعمل الأشياء كما تتوقع تمامًا (أي لا تنفجر). هذا الفواصل إذا كان الصف ، أو أي فصل يحتويه ، يكون كعضو هو مؤشر أو مرجع أو فصل يحتوي على دالة ظاهرية. بشكل أساسي ، إذا كان من الضروري إشراك المؤشرات في مكان ما ، فإن بياناتها القديمة ليست بسيطة.


يحتوي أحد كائنات POD (البيانات القديمة العادية) على أحد أنواع البيانات هذه - نوع أساسي أو مؤشر أو اتحاد أو بنية أو صفيف أو فئة - بدون مُنشئ. وبالعكس ، كائن غير POD هو كائن موجود منشئ. يبدأ كائن POD مدة حياته عندما يحصل على التخزين بالحجم المناسب لنوعه ونهايته الدائمة عند إعادة تخزين الكائن أو إعادة تخصيصه.

يجب ألا تحتوي أنواع PlainOldData أيضًا على أي من:

  • وظائف افتراضية (إما خاصة بها ، أو موروثة)
  • فصول أساسية افتراضية (مباشرة أو غير مباشرة).

يتضمن تعريف أكثر سهولة من PlainOldData كائنات مع المنشئات؛ لكنه يستثني الأشخاص الذين لديهم أي شيء افتراضي. تكمن المشكلة المهمة في أنواع PlainOldData في أنها غير متعددة الأشكال. يمكن أن يتم التوريث مع أنواع POD ، ومع ذلك يجب أن يتم فقط من أجل ApplicationInheritance (إعادة استخدام الكود) وليس تعدد الأشكال / subtyping.

هناك تعريف شائع (على الرغم من عدم صحته تمامًا) هو أن نوع PlainOldData هو أي شيء لا يحتوي على VeeTable.


POD لتقف على " البيانات القديمة السهلة" - أي ، فئة (سواء تم تحديدها باستخدام struct الكلمات الرئيسية أو class الكلمة الرئيسية) بدون وظائف المنشئات والمدمرات ووظائف الأعضاء الظاهرية. تذهب مقالة Wikipedia على POD إلى مزيد من التفاصيل وتعرّفها على النحو التالي:

بنية البيانات القديمة البسيطة في C ++ هي فئة تجميعية تحتوي فقط على PODS كأعضاء ، ولا يوجد بها destructor محدد من قبل المستخدم ، ولا يوجد عامل تعيين نسخ مخصص من قبل المستخدم ، ولا يوجد أعضاء nonstatic من نوع المؤشر إلى عضو.

يمكن العثور على مزيد من التفاصيل في هذه الإجابة عن C ++ 98/03 . قام C ++ 11 بتغيير القواعد المحيطة بـ POD ، مما يساعد على الاسترخاء بشكل كبير ، مما يستلزم إجابة للمتابعة هنا .





c++-faq