gpt4 book ai didi

c++ - 编译器可以省略以下拷贝吗?

转载 作者:IT老高 更新时间:2023-10-28 22:36:54 30 4
gpt4 key购买 nike

我还是一个新手程序员,我知道过早的优化不好,但我也知道复制大量的东西也是不好的。

我已经阅读了复制省略,它是同义词,但是例如 Wikipedia 上的示例让我觉得只有在要返回的对象在完全构造的同时返回时才会发生复制省略。

vector 之类的对象呢,通常只有在填充某些东西时才有意义,当用作返回值时。毕竟,空 vector 只能手动实例化。

那么,在这种情况下它也可以吗?

为了简洁而糟糕的风格:

vector<foo> bar(string baz)
{
vector<foo> out;
for (each letter in baz)
out.push_back(someTable[letter]);

return out;
}

int main()
{
vector<foo> oof = bar("Hello World");
}

我在使用 bar(vector & out, string text) 时没有遇到真正的麻烦,但上述方式在美学上和意图上看起来要好得多。

最佳答案

the examples on wikipedia for example make it seem to me that copy elision can only take place if the object to be returned gets returned at the same time it gets completely constructed.

这是误导(阅读:错误)。问题在于在所有代码路径中仅返回 one 对象,即仅发生潜在返回对象的 one 构造。

您的代码很好,任何现代编译器都可以省略拷贝。

另一方面,以下代码可能会产生问题:

vector<int> foo() {
vector<int> a;
vector<int> b;
// … fill both.
bool c;
std::cin >> c;
if (c) return a; else return b;
}

这里,编译器需要完全构造两个不同的对象,只有稍后决定返回哪一个,因此它必须复制一次,因为它不能直接在目标内存中构造返回的对象位置。

关于c++ - 编译器可以省略以下拷贝吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6139188/

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