gpt4 book ai didi

c++ - 什么是复制省略和返回值优化?

转载 作者:行者123 更新时间:2023-12-02 03:08:54 30 4
gpt4 key购买 nike

什么是复制省略?什么是(命名的)返回值优化?它们意味着什么?

它们会在什么情况下发生?有什么限制?

最佳答案

简介

技术概述 - skip to this answer .

对于发生复制省略的常见情况 - skip to this answer .

复制省略是大多数编译器实现的优化,以防止在某些情况下出现额外的(可能昂贵的)复制。它使得按值返回或按值传递在实践中变得可行(有限制)。

这是唯一一种消除(哈!)as-if 规则的优化形式 - 即使复制/移动对象有副作用,也可以应用复制消除

以下示例取自Wikipedia :

struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
};

C f() {
return C();
}

int main() {
std::cout << "Hello World!\n";
C obj = f();
}

根据编译器和设置,以下输出均有效:

Hello World!
A copy was made.
A copy was made.

<小时/>

Hello World!
A copy was made.

<小时/>

Hello World!

这也意味着可以创建更少的对象,因此您也不能依赖于调用的特定数量的析构函数。您不应该在复制/移动构造函数或析构函数中包含关键逻辑,因为您不能依赖它们的调用。

如果省略对复制或移动构造函数的调用,则该构造函数必须仍然存在并且必须可访问。这确保复制省略不允许复制通常不可复制的对象,例如因为它们有一个私有(private)的或已删除的复制/移动构造函数。

C++17:从 C++17 开始,直接返回对象时可以保证复制消除,在这种情况下,复制或移动构造函数不需要 可访问或存在:

struct C {
C() {}
C(const C&) { std::cout << "A copy was made.\n"; }
};

C f() {
return C(); //Definitely performs copy elision
}
C g() {
C c;
return c; //Maybe performs copy elision
}

int main() {
std::cout << "Hello World!\n";
C obj = f(); //Copy constructor isn't called
}

关于c++ - 什么是复制省略和返回值优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575458/

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