Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;优化器删除具有副作用的对象_C++_Optimization_Raii_Side Effects - Fatal编程技术网

C++ C++;优化器删除具有副作用的对象

C++ C++;优化器删除具有副作用的对象,c++,optimization,raii,side-effects,C++,Optimization,Raii,Side Effects,这目前不是一个问题,但我担心代码是否被移植,或者我们是否更改了编译器 我有一个代码块 { MyClass myObj; // copy some other variables but never touch myObj . . } // expect destructor to be called on myObj 其中myObj从未在块代码中使用,但构造函数有副作用,我依赖于MyClass的析构函数代码在块结束时执行。这在我当前的arm编译器上可以正常工作,并启用

这目前不是一个问题,但我担心代码是否被移植,或者我们是否更改了编译器

我有一个代码块

{ 
   MyClass myObj;
   // copy some other variables but never touch myObj
   .
   .
} // expect destructor to be called on myObj
其中myObj从未在块代码中使用,但构造函数有副作用,我依赖于MyClass的析构函数代码在块结束时执行。这在我当前的arm编译器上可以正常工作,并启用了一些优化

我的问题是,我需要做些什么,比如声明一些不稳定的东西,或者设置一些公共属性来防止优化器将myObj检测为未使用的变量或类似的东西


这不是一个C++11编译器。正如我所说,这目前不是一个问题,但我不想给其他人留下一个奇怪的错误。

因为您正在使用的编译器甚至与该标准略微兼容(我正在关注您的Turbo C++)。这不是一个问题,因为该标准对施工和破坏做出了强有力的保证。这些保证是“现代”C++风格的基础。

< P>除了明确定义的情况,优化不允许改变程序的可观察行为。优化必须遵循所谓的。

一个非平凡的构造函数或析构函数应该足以防止优化器消除它。请看可能的重复。是的,这是我认为我记得的,但我无法回忆起rational。Thanks@bd2357这些保证也是为什么UB使用跳过对象构造的
goto
的原因。跳过对象初始化不是未定义的行为,它的格式不正确。@BenjaminLindley true,很遗憾,我的注释编辑时间已过。更糟的根据我的经验,有些编译器允许这样做?我不知道你说的是哪一个。:)我不知道RVO,但拷贝构造函数中的副作用的想法本身就很可怕,因为它们通常作为析构函数隐藏起来。谢谢