C++关闭返回值优化后operator+调用出现额外析构函数的原因
你遗漏的是按值返回的临时对象在赋值表达式执行完成后的析构流程,编号(6)的~Foo()就是operator+返回的临时对象T2的析构调用。
完整的f3 = f1 + f2;执行流程(对应你给出的输出编号)如下:
- 调用
f1.operator+(f2),输出(1)的foo.operator+(const Foo&) - operator+内部构造局部临时对象T,调用构造函数输出(2)的
Foo(int, int) - 由于你使用了
-fno-elide-constructors禁用了所有复制省略优化,无法直接把局部对象T构造到返回值的内存地址,因此调用拷贝构造函数生成T的拷贝T2作为函数返回值,输出(3)的Foo(const Foo&) - operator+函数执行结束,局部临时对象T生命周期终止,调用析构输出(4)的
~Foo() - 临时对象T2作为拷贝赋值运算符的入参,执行
f3.operator=(T2),输出(5)的operator=(const Foo&) - 整个赋值表达式执行完毕,临时对象T2的生命周期终止,调用析构输出(6)的
~Foo()
补充说明:如果不添加-fno-elide-constructors选项,编译器会默认开启返回值优化,直接把operator+内部创建的T构造到返回值临时对象的内存位置,会省略掉T拷贝构造T2、T析构这两步,对应的(3)(4)输出就不会出现。
内容的提问来源于stack exchange,提问作者Ronaldinho
相关产品推荐
相关产品推荐

