假设我在 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
变量,还是先填充func
的f
,然后复制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/