gpt4 book ai didi

c++ - RVO, move 语义和优化代码的斗争

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:22 26 4
gpt4 key购买 nike

如果我没看错的话, move 语义允许从临时的、未命名的对象中 move 和重用资源。 RVO,尽管之前的 move 语义更进一步,并“窃取”了整个对象以避免额外的构造函数调用和赋值/复制函数。

这对我来说似乎有点违反直觉,如果被调用的构造函数直接使用最终左值目标的地址直接将数据放置在用户需要的位置,不是会更快、更简单且用户显而易见吗?

我的意思是,“在这个位置创建这个对象”似乎比“在某个地方创建这个对象,然后将它复制到正确的位置”更直观一些。

最佳答案

是的,它“有点违反直觉”。启用复制省略后,构造函数的所有副作用也将被省略。

#include <iostream>

struct X {
X() { std::cout << "Construct" << std::endl; }
X(X&&) { std::cout << "Move" << std::endl; }
~X() { std::cout << "Destruct" << std::endl; };
};

X f() { return X(); }

int main()
{
X x(f());
return 0;
}

复制省略:g++ -std=c++11 src-test/main.cc

Construct
Destruct

没有复制省略:g++ -std=c++11 -fno-elide-constructors src-test/main.cc

Construct
Move
Destruct
Move
Destruct
Destruct

编译器知道程序/库的构建硬件,能够应用(可选)复制省略。C++ 语言本身并不知道硬件特定的返回机制。因此,在这种情况下不可能在某个地址进行构造。

关于c++ - RVO, move 语义和优化代码的斗争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633067/

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