سؤال

هل تتم تهيئة الذاكرة العالمية في C++؟وإذا كان الأمر كذلك، كيف؟

(ثانيا) توضيح:

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

الوضع هو:هل يمكن تعيين مرجع مفرد - عبر ملف instance() الاتصال، قبل التهيئة:

MySingleton* MySingleton::_instance = NULL;

والحصول على مثيلين مفردين نتيجة لذلك؟

راجع اختبار C++ الخاص بي في مثيلات متعددة لمفردة...

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

المحلول

نعم تتم تهيئة البدائيات العامة إلى NULL.

مثال:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

لا يمكنك إجراء أي افتراضات حول الفئات أو البنيات أو المصفوفات أو كتل الذاكرة الموجودة في الكومة ...

من الأكثر أمانًا أن تقوم دائمًا بتهيئة كل شيء.

نصائح أخرى

من المعيار:

يجب أن تتم تهيئة الكائنات ذات مدة التخزين الثابتة (3.7.1) صفرًا (8.5) قبل إجراء أي تهيئة أخرى.يتم استدعاء التهيئة الصفرية والتهيئة بتعبير ثابت بشكل جماعي التهيئة الثابتة;كل التهيئة الأخرى هي التهيئة الديناميكية.يجب تهيئة كائنات أنواع POD [البيانات القديمة البسيطة] (3.9) مع مدة تخزين ثابتة تمت تهيئتها بتعبيرات ثابتة (5.19) قبل إجراء أي تهيئة ديناميكية.يجب أن تتم تهيئة الكائنات ذات مدة التخزين الثابتة المحددة في نطاق مساحة الاسم في نفس وحدة الترجمة والتي تمت تهيئتها ديناميكيًا بالترتيب الذي يظهر به تعريفها في وحدة الترجمة.[ملاحظة: 8.5.1 يصف الترتيب الذي تتم به تهيئة الأعضاء المجمعين.تم وصف الأولي من الأشياء الثابتة المحلية في 6.7.

لذا، نعم، ستتم تهيئة العناصر العالمية التي لها مدة تخزين ثابتة.لن تتم بالطبع تهيئة العناصر العالمية المخصصة، على الكومة على سبيل المثال، تلقائيًا.

قادمة من العالم المدمج..

يتم تجميع التعليمات البرمجية الخاصة بك في ثلاثة أنواع من الذاكرة:
1..بيانات:الذاكرة المهيأة
2..نص:الثوابت والكود
3..بسس:الذاكرة غير المهيأة (تتم تهيئتها إلى 0 في C++ إذا لم تتم تهيئتها بشكل صريح)

تدخل الكرات العالمية إلى .data إذا تمت تهيئتها.إذا لم يكن الأمر كذلك، فسيتم وضعها في .bss وصفر في الكود الأساسي.

تتم دائمًا تهيئة المتغيرات المعلنة بنطاق ثابت/عالمي ضمن VC++ على الأقل.

في بعض الظروف يمكن أن يكون هناك اختلاف في السلوك بين:

int x = 0;

int main() { ... }

و

int x;

int main() { ... }

إذا كنت تستخدم شرائح البيانات المشتركة، فإن VC++ يستخدم على الأقل وجود تهيئة صريحة مع ملف #pragma data_seg لتحديد ما إذا كان يجب إدخال متغير معين في مقطع البيانات المشتركة أو مقطع البيانات الخاصة لعملية ما.

لمزيد من المتعة، ضع في اعتبارك ما يحدث إذا كان لديك كائن C++ ثابت مع مُنشئ/مدمر تم الإعلان عنه في مقطع بيانات مشترك.يتم استدعاء المنشئ/المدمر في كل مرة يتصل فيها ملف exe/dll بمقطع البيانات وهو بالتأكيد ليس ما تريده.

مزيد من التفاصيل في هذا مقالة كيلوبايت

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