MSVC ++优化了易失性静态

时间:2013-11-08 15:33:27

标签: visual-c++-2012

我有一个Visual Studio解决方案,其中某些“插件”类向工厂类注册,以便可以通过名称创建“插件”。这些插件与工厂一起驻留在静态库项目中。

注册通过易失性静态注册模板类进行,每个模块都在自己的插件编译单元中(因此注册过程由每个插件“完成”,并且没有可用插件的中心信息),如:

volatile static StaticPluginRegisterHelper<PluginClass> s_register;

但问题是如果PluginClass没有在代码中的其他地方逐字使用,链接器会选择优化代码,即上面的静态执行。

在我看来,这似乎是一个编译器或链接器错误,因为我已经明确告知静态是易失性的(即“请勿触摸!”):)

显然,解决方法是将上面的注册移动到我知道总是包含在内的编译单元,这当然有效。然而,它不是那么整洁。

想法?

1 个答案:

答案 0 :(得分:0)

链接器不关心volatile。如果它得出的结论是符号未被引用,那么它将成为驱逐的候选者。要强制引用其他未引用的符号,可以添加/INCLUDE链接器选项。这也可以使用#pragma comment(linker,"/include:_s_register")嵌入到您的源代码中。 - IIns 23月11日13:11