跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 求教一个 c++语法问题, 这段代码为何只析构一次呢
未分類
24 11 月 2020

求教一个 c++语法问题, 这段代码为何只析构一次呢

求教一个 c++语法问题, 这段代码为何只析构一次呢

資深大佬 : jdz 2

class excption_test
{
public:
excption_test();
~excption_test();
};

excption_test::excption_test()
{
std::cout << “in constructorn”;
}

excption_test::~excption_test()
{
std::cout << “auto in destructor??n”;
}

excption_test get_ex()
{
excption_test c;
return c;
}

int main()
{
excption_test m = get_ex();
return 0;
}

我理解 get_ex()函数中创建了一个对象, 离开栈的时候会进行析构, 析构 c 对象, 同时调用拷贝构造函数拷贝给 main 函数中的 m 变量, 在 main 函数结束的时候再析构 m 对象

大佬有話說 (11)

  • 資深大佬 : hello2060

    很久没有搞 c++已经想不起来了,你这个 getex()对吗,确定这种写法没啥问题?

  • 資深大佬 : hello2060

    我是只直接返回一个栈上对象

  • 資深大佬 : hello2060

    如果可以的话看看有编译器优化吗

  • 主 資深大佬 : jdz

    @hello2060 是对的,我测试过。另外不太会看编译器优化,我觉的编译器优化不会改变程序执行结果

  • 資深大佬 : codehz

    @jdz RVO 是强制的,NRVO 是可选的,具体内容自己搜索

  • 資深大佬 : twoconk

    上是正解,实际项目中通常返回堆内存,RVO 即返回值优化,可以少做一次拷贝构造。

  • 資深大佬 : zhuangzhuang1988

    这个直接看 <深入理解 C++对象模型>
    里面有很多关于 这样的题目
    怎么重写

  • 資深大佬 : sfqtsh

    See https://en.wikipedia.org/wiki/Copy_elision

    g++你可以加选项 -fno-elide-constructors 取消优化

  • 資深大佬 : nightwitch

    触发了编译器优化呗,不一定是 RVO,有可能 get_ex()函数整个都被 inline 了,实际上的函数体是
    int main(){
    excption_test m;
    return 0;
    }

  • 資深大佬 : nightwitch

    在 g++10.2,开最高级别的优化,你的代码实际上被编译成了

    int main()
    {
    std::cout << “in constructorn”;
    std::cout << “auto in destructor??n”;
    return 0;
    }

    见 https://godbolt.org/z/14o3WY

  • 資深大佬 : 0x11901

    @nightwitch 编译器比我会写代码系列

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具