هل هذه الفئة C ++ تحتوي على صفيف حجم متغير استخدام تخصيص الذاكرة الديناميكية؟

StackOverflow https://stackoverflow.com/questions/554476

سؤال

هل تفعل شيئا مثل هذا استخدام تخصيص الذاكرة الديناميكية؟

template <class T, int _size> 
class CArray 
{ 
public:
    ... 
private:
    T m_data[_size]; 
};

هل يمكن لشخص ما أن يفسر لي ما الذي يحدث وراء الكواليس عندما أقوم بإنشاء الكائن؟

CArray<SomeObject, 32> myStupidArray;
هل كانت مفيدة؟

المحلول

كما ذكر في الإجابات الأخرى، يتم تقييم القوالب في تجميع الوقت. إذا كنت مهتما، فيمكنك تبصق G ++ التسلسل الهرمي للفئة حيث يمكنك التحقق من حجمها:

template <class T, int _size>
class CArray
{
public:
private:
  T m_data[_size];
};

int main(int argc, char **argv) {
  CArray<int, 32> myStupidArray1;
  CArray<int, 8> myStupidArray2;
  CArray<int, 64> myStupidArray3;
  CArray<int, 1000> myStupidArray4;
}

جمع مع -fdump-class-hierarchy:

g++ -fdump-class-hierarchy blah.cc

يجب أن يكون هناك ملف اسمه blah.cc.t01.class في الدليل الحالي:

Class CArray<int, 32>
   size=128 align=4
   base size=128 base align=4
CArray<int, 32> (0x40be0d80) 0

Class CArray<int, 8>
   size=32 align=4
   base size=32 base align=4
CArray<int, 8> (0x40be0e80) 0

Class CArray<int, 64>
   size=256 align=4
   base size=256 base align=4
CArray<int, 64> (0x40be0f80) 0

Class CArray<int, 1000>
   size=4000 align=4
   base size=4000 base align=4
CArray<int, 1000> (0x40be6000) 0

نصائح أخرى

لا، سيتم تخصيصه في المكان (على سبيل المثال إما على المكدس، أو كجزء من كائن يحتوي).

مع قوالب يتم تقييم المعلمات في وقت الترجمة حتى يصبح الكود الخاص بك بشكل فعال؛

class CArray 
{ 
public:
    ... 
private:
    SomeObject m_data[32]; 
};

قوالب يتم تقييمها في وقت الترجمة، لذلك يتم تجميع M_DATA [_Size] باسم m_data [32].

لا، فإنه لا يستخدم تخصيص الذاكرة الديناميكي. يعرف المحول البرمجي مقدار الذاكرة التي يجب تخصيصها، يتم تحديدها في وقت الترجمة، وليس في وقت التشغيل.

لا معنى له أن يفسر قوالب C ++ هنا، يتم شرحها بشكل جيد في صفحات أخرى، مثل في C ++ أسئلة وأجوبة لايت.

يعرف حجم الصفيف في وقت الترجمة، لذلك لا، لن يستخدم تخصيص الذاكرة الديناميكي هنا. إذا كنت تعلن الصفيف في نطاق الوظيفة، فسيتم وضعه على المكدس تماما مثل أي نوع آخر من الكائنات.

عند تحديد الكائنات المتغيرة الحجم مثل هذا، ما يحدث حقا هو أن برنامج التحويل البرمجي يقوم ببناء تعريف فئة "للطلب". ستقوم فقط باستخدام تعريف فئة يحتوي على 't m_data [32]' في ذلك.

1- يتم تقييم القوالب فقط في وقت الترجمة. لذلك هذه الصفيف سيكون حجم 32

2- لا يمكنك إنشاء صفيف على المكدس باستخدام متغير، يجب أن يكون ثابتا يمكن تقييمه في وقت الترجمة، وإلا يمكنك استخدام جديد (أو malloc)

يحدث تخصيص الذاكرة الديناميكي عادة عند استدعاء new المشغل (أو أحد أصدقائه). هذا يخصص جزء من الذاكرة من احتياطي الذاكرة يشار إليها عادة باسم كومة. تذكر أنه على عكس التخصيص الثابت، لا يهتم المترجم بالذاكرة الحرة، لذلك عليك أن تفعل ذلك يدويا باستخدام delete المشغل (أو نسخة مناسبة لها).

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