10

globals/static-class-members のすべての初期化は、main() の最初の行の前に行われると考えることに慣れています。しかし、私は最近、「モジュールの動的ロードを支援する」ために、標準が後で初期化を行うことを許可していることをどこかで読みました。動的リンク時にこれが当てはまることがわかりました。ライブラリを dlopen する前に、ライブラリで初期化されたグローバルが初期化されるとは思いません。ただし、静的にリンクされた翻訳単位 (私のアプリの直接の .o ファイル) のグループ内では、この動作は非常に直感的ではありません。これは、動的にリンクするときにのみ遅延して発生しますか?それともいつでも発生する可能性がありますか? (または、私が読んだものが間違っていましたか?;)

4

4 に答える 4

0

疑似コードを見てみましょう:

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;
}
于 2009-08-06T14:48:46.927 に答える