gpt4 book ai didi

c++ - 编译器优化

转载 作者:可可西里 更新时间:2023-11-01 15:00:22 25 4
gpt4 key购买 nike

所以我有一个问题要问你。 :)你能告诉我以下代码应该产生的输出吗?

#include <iostream>
struct Optimized
{
Optimized() { std::cout << "ctor" << std::endl; }
~Optimized() { std::cout << "dtor" << std::endl; }
Optimized(const Optimized& copy) { std::cout << "copy ctor" << std::endl; }
Optimized(Optimized&& move) { std::cout << "move ctor" << std::endl; }
const Optimized& operator=(const Optimized& rhs) { std::cout << "assignment operator" << std::endl; return *this; }
Optimized& operator=(Optimized&& lhs) { std::cout << "move assignment operator" << std::endl; return *this; }
};

Optimized TestFunction()
{
Optimized a;
Optimized b = a;
return b;
}

int main(int argc, char* argv[])
{
Optimized test = TestFunction();
return 0;
}

我的第一 react 是:

  1. 负责人
  2. 文案
  3. 移动构造器
  4. 经理
  5. 经理
  6. 经理

这是真的,但只有在关闭编译器优化的情况下。当优化打开时,输出是完全不同的。启用优化后,输出为:

  1. 负责人
  2. 文案
  3. 经理
  4. 经理

通过编译器优化,测试变量是返回变量。

我的问题是,什么条件会导致无法以这种方式进行优化?

我一直被教导说,返回一个导致额外复制构造函数的结构/类可以通过作为引用传入来更好地优化,但编译器正在为我做这件事。那么 return 结构仍然被认为是错误的形式吗?

最佳答案

这被称为复制省略,是一种特殊处理,而不是复制/移动。

标准特别允许优化,只要可以复制/移动(即,方法已声明且可访问)。

在这种情况下,编译器中的实现通常称为返回值优化。有两种变体:

  • RVO:当你返回一个临时的(return "aa"+ someString;)
  • NRVO:N 代表命名,当你返回一个有名字的对象时

两者都由主要编译器实现,但后者可能只在更高的优化级别上发挥作用,因为它更难检测。

因此,回答您有关返回结构的问题:我会推荐它。考虑:

// Bad
Foo foo;
bar(foo);

-- foo can be modified here


// Good
Foo const foo = bar();

后者不仅更清晰,还允许 const 强制执行!

关于c++ - 编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7261145/

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