0

クラスコンストラクターの最初の使用時に、クラス内の静的データの遅延初期化のために std::call_once() および std::once_flag を使用するクラスがあります。したがって、once_flag はクラスの静的メンバーです。私の問題は、メイン アプリケーションと、アプリケーションが異なる時間にロードおよびアンロードするさまざまな DLL の間でこれを共有する最善の方法がわからないことです。

私が持っていた唯一のアイデアはstd::once_flag *GetOnceFlag()、DLL のクラスが GetOnceFlag() で call_once() を使用するのに対し、静的な once_flag のアドレスを返す EXE のバージョンのクラスをエクスポートすることでした:MyClass::Myclass(void) { call_once(*GetOnceFlag(), &MyClass::Init, this); }このアプローチは機能しますか?

欠点は、ctor が GetOnceFlag() を呼び出すたびに、軽量の ctor には非効率的であることです (私の場合、call_once() を呼び出すだけです)。しかし、ポインターをそのままキャッシュすることによって暗示される競合MyClass::Myclass(void) { if (!_pflag) _pflag = GetOnceFlag(); call_once(*_pflag, &MyClass::Init, this); }が問題であるかどうかはわかりません (ポインターの書き込みは、関心のあるすべてのプラットフォームでアトミックであるため、GetOnceFlag() が同時に呼び出される場合は、そうすべきだと思いますわかりましたが、完全には確信が持てません)。

コメントとより良い解決策を歓迎します。

編集: 共有クラスは、他のユーザーが使用する別の DLL に配置できることはわかっていますが、MSVC が行うプログラム全体の最適化/リンク時のコード生成には影響しませんか? /GL および /LTCG のドキュメントに記載されているモジュール間の最適化は、リンクされている個々のオブジェクトと静的ライブラリのみであり、DLL の境界を越えて発生することはないと想定しています。

4

0 に答える 0