C++ 按值返回函数优化
示例函数1C++ 按值返回函数优化,c++,segmentation-fault,C++,Segmentation Fault,示例函数1 int func1 (int arg) { return arg + 10; } 示例函数2 int func1 (int arg) { int retval = arg + 10; return retval; } 这些函数(示例1和示例2)的运行时行为之间有什么区别吗? 我的代码中有一个函数定义,它使用示例1样式的函数定义。当我调用此函数一百万次(对于较少的迭代不可复制)并尝试将此值传递给func_xyz时,我得到一个segf
int func1 (int arg)
{
return arg + 10;
}
示例函数2
int func1 (int arg)
{
int retval = arg + 10;
return retval;
}
这些函数(示例1和示例2)的运行时行为之间有什么区别吗?
我的代码中有一个函数定义,它使用示例1样式的函数定义。当我调用此函数一百万次(对于较少的迭代不可复制)并尝试将此值传递给
func_xyz
时,我得到一个segfault
。然而,当我使用示例2样式定义时,segfault
消失了。但我无法理解这种行为的原因。在理论中在函数2中,将启动一个局部变量(这将占用更多的空间),然后计算并将值复制到变量的位置。之后,副本将被复制到返回值。这是一个额外的复制操作
在现实中编译器在编译时进行优化,如果不实际使用不需要的变量的值,则删除它们。(重构)以下是有关重构的一些详细信息
尝试使用具有非平凡复制构造函数的类,以查看实际发生的情况 绝对没有区别。任何编译器都可以看到代码只是 int main() { func_xyz(20); }
被调用的函数是做什么的???你的问题是…?如果他想问哪个更有效或者练习更好呢?@PigBen-很好的心理回答!(虽然没有徽章!)使用优化编译器,可能没有什么区别。@ayush:在这种情况下,后者会是一个更好的选择,因为它比前者使用更少的代码。可能只是我,但当我看到代码声明了无用的变量,只是为了存储一个值,然后在以后使用时,我会很恼火在返回之前是否还隐式使用局部变量来存储
arg+10
的结果?我并不是说这有什么特别的意思,只是这两个程序集看起来都像addr1,10//r1+10不直接返回代码>retr1代码>
func_xyz (int x);
int main ()
{
int a = 10;
int p = func1 (a);
func_xyz(p);
}