gpt4 book ai didi

c++ - RVO 和 NRVO 优化 + C++11 move 运算符

转载 作者:行者123 更新时间:2023-11-27 23:11:07 25 4
gpt4 key购买 nike

我正在尝试弄清楚 RVO 和 NRVO 如何与新的 C++11 move 运算符一起工作。我已经起草了一个带有几个示例的虚拟类。

编辑:只显示了代码中最重要的部分。

完整的源代码可用here .

我有两个函数获取类作为引用并返回值或引用:

VOpt& fChangeClassRetRef(VOpt &m) {
m.setX(21);
return m;
}

VOpt fChangeClassRetValue(VOpt &m) {
m.setX(21);
return m;
}

当我调用这些函数时,输出如下:

VOpt &m14 = fChangeClassRetRef(m13);

m14 = fChangeClassRetRef(m11);
-> Copy Assignment Operator

m14 = fChangeClassRetValue(m11);
-> Copy Constructor
-> C++11 Move Operator

当使用左值引用时,不会调用复制构造函数。否则,那些函数(接收引用作为参数)仍会调用复制构造函数。

此功能是否依赖于编译器?我做错了什么吗?

最佳答案

m14 = fChangeClassRetRef(m11);
-> Copy Assignment Operator

该函数返回一个引用(左值),它不能进行 move 赋值,因为参数不是右值。

m14 = fChangeClassRetValue(m11);
-> Copy Constructor
-> C++11 Move Operator

复制构造函数在内部被触发以创建返回值。它必须是复制构造函数而不是 move 构造函数,因为参数是引用(左值)。将返回值赋给 m14 使用 move 赋值运算符,因为参数是右值。

关于c++ - RVO 和 NRVO 优化 + C++11 move 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com