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

标签 c++ optimization c++-faq return-value-optimization copy-elision

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

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

最佳答案

简介

技术概述 - 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/27853881/

相关文章:

php - C++ 轻量级 linux web 直通服务器

algorithm - 查询n次时如何改进Dijkstra算法?

multithreading - 用于优化性能的Elasticsearch文档结构

javascript - 在 jQuery 中使用 * 选择器将 CSS3PIE 与 Modernizr 一起应用

c++ - 运算符重载的基本规则和惯用法是什么?

c++ - 如何在 C++ 中将一列数字与不同长度的字符串行分开?

c++ - C++ 库中更优雅的错误处理 - jsoncpp

作为参数传递的 C++ 调用方法

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?