【发布时间】:2009-08-04 19:26:49
【问题描述】:
我正在使用静态初始化来简化在 C++ 中向工厂注册某些类的过程。不幸的是,我认为编译器正在优化“未使用”的对象,这些对象旨在在其构造函数中完成有用的工作。有没有办法告诉编译器不要优化全局变量?
class SomeClass {
public:
SomeClass() {
/* do something useful */
}
};
SomeClass instance;
我在 SomeClass 的构造函数中的断点没有被命中。在我的实际代码中,SomeClass 在头文件中,而实例在源文件中,或多或少是单独的。
编辑:正如 KJAWolf 所猜测的,这段代码实际上被编译成一个静态库,而不是可执行文件。其目的是将静态库也提供的某些类型注册到类型及其创建者的静态列表中,以便工厂在构造时从中读取。由于这些类型是随 lib 提供的,因此不希望将此代码添加到可执行文件中。
我还发现,通过将代码移动到另一个包含其他现有代码的源文件,它可以正常工作。似乎有一个完全由这些全局对象组成的文件是导致问题的原因。就好像那个翻译单元被完全忽略了一样。
【问题讨论】:
-
你的源文件是可执行文件的一部分,还是静态库的一部分?
-
啊哈,很好的占卜工作。实际上源文件是静态库的一部分。这会导致问题吗?我有 80% 的把握我以前做过完全相同的事情,而且效果很好。
-
我遇到了同样的问题:stackoverflow.com/questions/599035/…
-
为什么要使用全局变量?
-
正如我所说,在静态初始化时执行一些代码,向工厂注册一个类。我有意识地决定将它们用于此目的,以防这会导致讲座:)我遇到麻烦的原因是我是一个优秀的程序员,所以我从来没有真正使用过它们,也不明白为什么他们没有像我预期的那样工作!
标签: c++ global-variables