Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按值返回函数优化_C++_Segmentation Fault - Fatal编程技术网

C++ 按值返回函数优化

C++ 按值返回函数优化,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

示例函数1

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);  
}