gpt4 book ai didi

c++ - 在实践中何时调用 move 构造函数?

转载 作者:行者123 更新时间:2023-12-03 20:22:51 26 4
gpt4 key购买 nike

我最近了解了 move 构造函数,但很多在线资源都没有讨论复制省略。复制省略对我来说也很有意义,但它让我想知道何时会在没有 super 人为示例的情况下调用 move 构造函数。
来自一个流行的 SO 帖子,它向我解释了 move 语义 https://stackoverflow.com/a/3109981/11188084

string b(x + y);                                
string c(some_function_returning_a_string());
帖子说这两个都应该调用 move 构造函数,因为它们接受临时变量。但是,这些实际上都没有调用 move 构造函数(我有 tested),相反,它们都只是执行复制省略,除非您通过显式编写 std::move 强制它这样做。 .
string b(std::move(x + y)); 
string c(std::move(some_function_returning_a_string()));
some_function_returning_a_string返回 std::move(someString) .但你为什么要这样做?复制省略甚至比 move 语义更高效。那么在什么情况下会调用 move 构造函数而不是复制省略呢?
在你指出我之前,我感觉就像 When Does Move Constructor get called?答案给出了人为的例子,或者他们中的一些人只是做了复制省略。我有兴趣学习在实践中何时调用 move 构造函数。
这是测试的链接 https://godbolt.org/z/KfczbboTr

最佳答案

在您的示例中,从对象 move 是暂时的,但 move 时并非总是如此。有时我们知道我们可以 move ,因为 move 的 from 对象将不再使用,即使它不是临时的。考虑这种类型:

struct foo {
foo() = default;
foo(foo&& f) noexcept {
std::cout << "move\n";
}
};
当您创建 foo 的 vector 时s 和 vector 重新分配它不会复制元素,但会 move 它们。例如:
#include <iostream>
#include <vector>

int main() {
std::vector<foo> v;
v.resize(5);
v.resize(v.capacity()+1); // force the vector to reallocate
}
output :
move
move
move
move
move
复制或 move 不可能被省略,因为元素在旧位置并且必须以某种方式到达内存中的新位置。

关于c++ - 在实践中何时调用 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67791095/

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