私の質問は単純ですが、おそらく答えはそうではありません。
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 のロード時に静的なインスタンス化が行われるのか、それとも遅延する可能性があるのかということでした。この質問をするのは、ときどき奇妙な動作を観察し、非同期の問題のように見えるからです... ???