c++ - 编译器会优化返回具有固定大小数组的结构的函数吗?

标签 c++ c struct return-value return-value-optimization

假设我在 C/C++ 中有一个具有固定大小数组成员的 struct,例如:

#define SIZE 10000
struct foo{
  int vector_i[SIZE];
  float vector_f[SIZE];
};

我想创建一个函数来返回 foo 的实例,例如:

foo func(int value_i, float value_f){
  int i;
  foo f;
  for(i=0;i<SIZE;i++) f.vector_i[i] = value_i;
  for(i=0;i<SIZE;i++) f.vector_f[i] = value_f;
  return f;
}

如果我调用该函数使用:

foo ff = func(1,1.1);

编译器会执行某种优化(即 TCO)吗?

可执行文件是直接填充ff变量,还是先填充funcf,然后复制f的所有值ff?

如何检查是否执行了优化?

最佳答案

我的回答适用于 C++。

Will the compiler perform some kind of optimization (ie TCO)?

您所说的 TCO 是指“尾调用优化”吗?该函数不会在最后进行函数调用(尾调用,如果您愿意的话),因此优化不适用。

编译器可以 elide由于命名返回值优化,从返回值到临时值的拷贝。来自临时文件的复制初始化也可以省略。


How can I check if the optimization is performed?

通过读取生成的汇编代码。

如果您无法阅读汇编,另一种方法是添加具有副作用的复制和移动构造函数,并观察这些副作用是否发生。但是,修改程序可能会影响编译器是否决定优化(但不需要副作用来防止复制省略)。


如果您不想依赖优化,您应该通过引用(c 中的指针)将现有对象显式传递给函数,并就地修改它。


复制省略的标准引用 [class.copy] §31 (current standard draft)

When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the constructor selected for the copy/move operation and/or the destructor for the object have side effects. [...]

该部分描述了在这种情况下满足的标准。引用是从 2016-04-07 的标准文档草稿中生成的。编号可能因标准文档的不同版本而异,规则也略有变化。引用的部分自 c++03 以来一直没有变化,其中的部分是 [class.copy] §15。

关于c++ - 编译器会优化返回具有固定大小数组的结构的函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37185072/

相关文章:

c++ - 检索元素大小的函数

c - 为什么使用 AVX2 的加速比预期的要低?

c - 如何停止在 C 中显示输入项

c# - "primitive"类型是如何非递归定义的?

c++ - CUDA 盒式过滤器如何工作?

c++ - 从 Boost 多索引迭代器获取数字索引

c - 以下 C 程序的行为是否未定义?

c - 结构变量初始化的问题

class - 在 Swift 中建模对象

c++ - 如何在 OpenCV 的 cvShowImage() 函数调用的窗口中显示中文文本?