假设我struct
在C / C ++中具有固定大小的数组成员,例如:
#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
变量,或者它会先填f
的func
,然后从复制的所有值f
来ff
?
如何检查优化是否已执行?
我的答案适用于c ++。
编译器会执行某种优化(即TCO)吗?
TCO是指“尾部呼叫优化”吗?该函数不会在最后进行函数调用(如果愿意,则可以进行尾部调用),因此优化不适用。
编译器可以 的Elid从返回值拷贝到临时因命名返回值优化。也可以取消临时副本的复制初始化。
如何检查优化是否已执行?
通过读取生成的汇编代码。
如果您无法阅读汇编,则另一种方法是添加具有副作用的复制并移动构造函数,并观察这些副作用是否发生。但是,修改程序可能会影响编译器是否决定进行优化(但是不需要副作用以防止复制遗漏)。
如果您不想依赖优化,则应通过引用(c中的指针)将传递的对象显式传递给函数,然后就地对其进行修改。
复制省略的标准参考[class.copy]§31(当前标准草案)
当满足某些条件时,即使为复制/移动操作选择的构造函数和/或对象的析构函数具有副作用,也允许实现忽略类对象的复制/移动构造。[...]
本节介绍了在这种情况下要满足的条件。引用来自于2016-04-07的标准文档草案。编号可能因标准文档的不同版本而异,并且规则略有更改。自c ++ 03起,引用的部分一直未更改,该部分的内容为[class.copy]§15。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句