按值返回函数优化

时间:2011-02-10 19:55:59

标签: c++ segmentation-fault

示例功能1

int func1 (int arg)  
{  
   return arg + 10;  
}

示例功能2

int func1 (int arg)  
{  
   int retval = arg + 10;  
   return retval;  

}

func_xyz (int x);  

int main ()  
{  
int a = 10;  
int p = func1 (a);  

func_xyz(p);  
}  

这些功能的运行时行为(样本1和样本2)之间是否存在差异?

我的代码中有一个使用样本1样式函数定义的函数定义。当我调用这个函数时,一百万次(对于较小的迭代不可重现)并尝试将此值传递给func_xyz,我得到一个segfault。但是,当我使用样本2样式定义时,segfault消失了。但我无法理解这种行为的原因。

3 个答案:

答案 0 :(得分:2)

在函数2的 THEORY 中将启动一个局部变量(这将占用更多的空间),然后计算计算并将值复制到变量的位置。
之后,副本将被复制到返回值。这是一个额外的复制操作。

REALITY 编译器中的

在编译时进行优化,如果实际未使用其值,则删除不需要的变量。 (重构)

答案 1 :(得分:1)

以下是return value optimization in compilers

的一些细节

尝试使用具有非平凡复制构造函数的类来查看实际发生的情况。

答案 2 :(得分:0)

绝对没有区别。任何编译器都可以看到代码只是

int main() {    func_xyz(20); }

被叫函数做什么?