变量定义成 volatile ,避免优化掉。

 ​

前两天在做讲课资料的时候遇到一个比较坑的问题。一般来说调用拷贝构造函数分三种情况

1.当用类一个对象去初始化另一个对象时。

2.如果函数形参是类对象。

3.如果函数返回值是类对象,函数执行完成返回调用时。

 

道理很简单,我写了个很简单的例子

【GCC】通过参数-fno-elide-constructors关闭g++的编译优化_g++

在fun函数中会返回一个class A的对象,那么编译器会在栈上构造一个临时对象,构造临时对象的方法则是调用拷贝构造函数

结果运行后,如下图

【GCC】通过参数-fno-elide-constructors关闭g++的编译优化_初始化_02

没有打印出拷贝构造函数的结果。后来经过查找发现是因为g++编译器实现省略创建一个只是为了初始化另一个同类型对象的临时对象。指定这个参数(-fno-elide-constructors)将关闭这种优化,强制g++在所有情况下调用拷贝构造函数。这个参数的man手册如下:

-fno-elide-constructors

The C++ standard allows an implementation to omit creating a temporary that is only used to initialize another object of the same type. Specifying this option disables that optimization, and forces G++ to call the copy constructor in all cases.

 

那么加上这个参数重新编译试试,运行结果如下。

【GCC】通过参数-fno-elide-constructors关闭g++的编译优化_拷贝构造函数_03