【发布时间】:2011-11-27 16:23:53
【问题描述】:
假设我有以下内容:
int main() {
SomeClass();
return 0;
}
如果不优化,SomeClass()的构造函数会被调用,然后它的析构函数会被调用,对象就没有了。
但是,根据 IRC 频道,如果编译器认为 SomeClass 构造函数/析构函数没有副作用,构造函数/析构函数调用可能会被优化掉。
我想解决这个问题的明显方法不是使用一些构造函数/析构函数(例如使用函数或静态方法等),但是有没有办法确保构造函数/析构函数的调用?
【问题讨论】:
-
如果它没有改变世界,你为什么还要执行它?
-
C++ 编译器将 C++ 源代码转换为可执行形式。您已经为构造函数/析构函数编写了不执行任何操作的源代码,因此编译器生成了不执行任何操作的可执行代码。
-
我相信这是您使用哪种编译器的问题。例如,MSVC 编译器对临时对象非常宽容,可能不会优化此代码。
-
当我需要在函数中的某个点执行某个操作时,我会使用此模式,并且我想保证在我离开该函数时会发生另一个操作。例如:在分析代码中,我将有一个 Timer 对象,该对象将向管理器注册其自身及其构造开始时间,然后在析构函数上发出结束时间信号。该代码从未在 msvc/gcc/llvm 上为我优化过。我想如果构造函数和析构函数都是nops,那么编译器可以跳过堆栈分配,但是你为什么要关心呢?
-
@ChrisSubagio:我猜注册/发送计时器是通过函数调用完成的。如果编译器不知道这些函数,它必须假设它们具有可观察的行为,并且如果编译器知道这些函数,它就知道它们具有。
标签: c++ optimization