3

私の質問は単純ですが、おそらく答えはそうではありません。

C++ (Win7 で Intel C++ 13.1 コンパイラを使用) では、グローバル静的変数 は実行前に常にインスタンス化されますか? main()いいえの場合、コンパイル オプション (など) に依存します/Oxか?

それらがDLLで宣言および定義されている場合、それは同じですか?

ここにケースがあります:

私は次のようなものを持っています:

// in DLL.h
class MyClass
{
public:
    MyClass();
};

static MyClass *sgMyClassPtr;

// in DLL.cpp
MyClass *sgMyClassPtr = new MyClass;

MyClass::MyClass()
{
    // Code to execute here
}

export 宣言を省略しましたが、正しくエクスポートされていることに注意してください。

私のメイン アプリケーション コードから、MyClass::MyClass()実行時に常に実行されているとは限らないようです。よくわかりませんが、DLL がまだロードされていないか、スタティックが正しくインスタンス化されていないようです。スレッド化がなく、すべての呼び出しが同期的であることに注意してください (少なくとも私のコードでは!)

ご意見やご提案がありましたら、よろしくお願いいたします。ありがとうございました!


更新 1

何をしたかよりも、何を手に入れたいかを伝えた方が楽かもしれません...

DLL のロード時に自動的にインスタンス化される変数が必要です。この変数は、アプリケーション (.exe) のシングルトンによって登録されます (たとえば、std::set に格納される ptr)。アプリケーション シングルトンは DLL を認識していませんが、DLL はアプリケーション シングルトンを認識しています。したがって、DLL のロード時に、var をすぐにインスタンス化し、それ自体をアプリケーション シングルトンに登録します。そのため、DLL 内で var static を宣言し、そこでインスタンス化しました。登録は cTor で行われます。

私の最初の質問は、DLL のロード時に静的なインスタンス化が行われるのか、それとも遅延する可能性があるのか​​ということでした。この質問をするのは、ときどき奇妙な動作を観察し、非同期の問題のように見えるからです... ???

4

1 に答える 1

0

静的な初期化は DLL のロード時に行われますが、リンカー オプションによっては、DLL をデマンド ロードすることができます。DLL とメイン プログラムの両方にクラスを含め、DLL からエクスポートしない場合、コードの 2 つのコピーと、(クラス) 静的変数の 2 つのコピーを取得する可能性があることに注意してください。そのため、一方のコピーが実際に初期化されているのに、もう一方のコピーが初期化されていないことに混乱する可能性があります。

ただし、最初に DLL の遅延読み込みに関するリンカー オプションを理解しておく必要があります。

于 2014-03-22T03:25:31.253 に答える