0

我有一个使用 std::call_once() 和 std::once_flag 的类,用于在第一次使用类构造函数期间对类中的静态数据进行延迟初始化。因此,once_flag 是类的静态成员。我的问题是我不知道在主应用程序和应用程序在不同时间加载和卸载的各种 DLL 之间共享它的最佳方式。

我唯一的想法是让 EXE 版本的类导出一个std::once_flag *GetOnceFlag()返回静态 one_flag 的地址,而 DLL 中的类将使用 call_once() 和 GetOnceFlag():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