سؤال

أنا معتاد على التفكير في كل تهيئة العالم / الأعضاء الثابت، كما يحدث قبل السطر الأول من الرئيسي (). لكنني قرأت مؤخرا في مكان ما أن المعيار يسمح بتهيئة التهيئة لاحقا "المساعدة في التحميل الديناميكي للوحدات النمطية". أستطيع أن أرى أن هذا صحيح عند الارتباط الديناميكي: لا أتوقع تهيئة عالمية تتم تهيئتها في مكتبة ليتم تهيئتها قبل أن أمتلك المكتبة. ومع ذلك، في غضون مجموعة من وحدات الترجمة القانونية (ملفات .o المباشرة للتطبيق الخاص بي)، أود أن أجد هذا السلوك بلا شك. هل يحدث هذا فقط بتكاسل عند ربطه ديناميكيا أو يمكن أن يحدث في أي وقت؟ (أو كان ما قرأته خطأ فقط؟

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

المحلول

يحتوي المعيار على ما يلي في 3.6.2 / 3:

يتم تحديده حول التنفيذ ما إذا كان التهيئة الديناميكية (8.5 و 9.4 و 12.1 و 12.6.1) من كائن من نطاق مساحة الاسم تتم قبل بيان رئيسي الرئيسي. إذا تم تأجيل التهيئة إلى نقطة ما في الوقت المناسب بعد العبارة الأولى الرئيسية، فسيحدث قبل الاستخدام الأول لأي وظيفة أو كائن محدد في نفس وحدة الترجمة مثل الكائن المراد تهيئة الكائن.

لكن بالتأكيد تستطيع أبدا رسميا أخبر عندما يحدث التهيئة منذ أن تحدث التهيئة قبل الوصول إلى المتغير! كالآتي:

// t1.cc
#include <iostream>
int i1 = 0;

int main () {
  std::cout << i1 << std::endl

// t2.cc
extern int i1;
int i2 = ++i1;

يمكنني أن أتفق مع أن G ++ 4.2.4 على الأقل يبدو أن أداء تهيئة "I2" قبل الرئيسي.

نصائح أخرى

المشكلة التي أراد المرء أن يحلها مع هذه القاعدة هي واحدة من التحميل الديناميكي. لا يقتصر البدل على التحميل الديناميكي ويمكن أن يحدث رسميا للحالات الأخرى. لا أعرف التنفيذ الذي يستخدمه لأي شيء آخر من التحميل الديناميكي.

دعونا مراجعة pseudocode:

في DLL:

static int ItsDllVar = 1;
int EXPORTED_FUNCTION() { return ItsDllVar; }

في التطبيق:

static int AppVar1 = 2;
static int AppVar2 = EXPORTED_FUNCTION() + AppVar1;

لذلك وفقا لتهيئة التهيئة الثابتة appvar2 يحصل 1 + 2 = 3

تهيئة كسول ينطبق على المتغيرات الثابتة المحلية (بغض النظر عن DLL)

int f()
{
    static int local_i = 5;//it get's 5 only after visiting f()
    return local_i;
}

أعتقد أن هذا ما حدث في حالتي مع g ++ 4.7 و cmake (غير متأكد من ذلك إذا كانت هذه تفاصيل ذات صلة بخصوص cmake). لدي رمز يسجل وظيفة في المصنع. إنه يعتمد على منشئ يدعو من متغير تهيئة عالميا.

عندما كان هذا الرمز في مكتبة مرتبطة قانونيا التهيئة لم يحدث! يعمل الآن بشكل جيد، عندما نقلته إلى ملفات الكائنات التي ترتبط مباشرة (أي، لا يتم دمجها في مكتبة أولا).

لذلك، أظن أنك صحيحة.

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