示例功能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
消失了。但我无法理解这种行为的原因。
答案 0 :(得分:2)
在函数2的 THEORY 中将启动一个局部变量(这将占用更多的空间),然后计算计算并将值复制到变量的位置。
之后,副本将被复制到返回值。这是一个额外的复制操作。
在编译时进行优化,如果实际未使用其值,则删除不需要的变量。 (重构)
答案 1 :(得分:1)
以下是return value optimization in compilers。
的一些细节尝试使用具有非平凡复制构造函数的类来查看实际发生的情况。
答案 2 :(得分:0)
绝对没有区别。任何编译器都可以看到代码只是
int main() { func_xyz(20); }
被叫函数做什么?