Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++_C_Function - Fatal编程技术网

C++ 哪种方法比较快:按函数返回值,还是将值保存在参数/参数中

C++ 哪种方法比较快:按函数返回值,还是将值保存在参数/参数中,c++,c,function,C++,C,Function,有人请告诉我以下哪一个更快,为什么 int add(int a, int b){ return a+b; } 或 很可能函数是内联的,并且两个函数都会生成相同的代码。很可能函数是内联的,并且两个函数都会生成相同的代码。由于值通常在寄存器中返回,因此返回值的速度不太可能比保存值的速度慢(如果CPU有一个值且返回值合适,则通常为累加器)。返回值不太可能比保存值慢,因为值通常在寄存器中返回(如果CPU有一个值且返回值合适,则通常为累加器).您不应该通过查看代码来猜测哪一个更快,而应该分析正

有人请告诉我以下哪一个更快,为什么

int add(int a, int b){
     return a+b;
}


很可能函数是内联的,并且两个函数都会生成相同的代码。

很可能函数是内联的,并且两个函数都会生成相同的代码。

由于值通常在寄存器中返回,因此返回值的速度不太可能比保存值的速度慢(如果CPU有一个值且返回值合适,则通常为累加器)。

返回值不太可能比保存值慢,因为值通常在寄存器中返回(如果CPU有一个值且返回值合适,则通常为累加器).

您不应该通过查看代码来猜测哪一个更快,而应该分析正在考虑的选项,看看其中一个是否比另一个快,以及它是否真的有区别。现在关于您的示例,我认为按值返回根本没有问题,因为现在大多数编译器都执行。On最重要的是,C++11引入了移动语义,这意味着,在适用的情况下,数据从临时对象“移动”到目标对象。因此,实际上,按值返回可能更快,因为您不必检查输入


有关按值传递的相关讨论,请参阅;有关相关问题,请参阅。

您不应该通过查看代码来猜测哪一个更快,而应该分析正在考虑的选项,以了解其中一个是否比另一个快,以及它是否真的会产生影响。关于您的示例,我认为按值返回这一点都没有问题,因为现在大多数编译器执行的都是形式的。除此之外,C++11引入了移动语义,这意味着,在适用的情况下,数据从临时对象“移动”到目标对象。因此,实际上,按值返回可能会更快,因为您不必检查输入


有关按值传递的相关讨论,请参阅;有关相关问题,请参阅。

如果没有,则我希望以后的版本会稍微慢一些,假设它必须取消对内存的引用,并且不能单独使用寄存器……为什么不在答案中添加注释呢+1@Prince约翰·卫斯理:因为如果编译器不能插入这么简单的函数,那么尝试优化任何东西都没有意义。关于未定义的行为,你指的是什么代码?@Benjamin Lindley:
*b=a+(*b);
我不确定在
=
处是否有序列点,但我相信没有……你能确认(或否认)吗这?如果不是,那么我希望以后的版本会稍微慢一点,假设它必须取消引用内存,并且不能单独使用寄存器…为什么不在答案中添加注释呢+1@Prince约翰·卫斯理:因为如果编译器不能内联这样一个简单的函数,那么尝试优化任何东西都没有意义关于未定义的行为,你指的是ode吗?@Benjamin Lindley:
*b=a+(*b);
我不确定在
=
处是否有序列点,但我相信没有……你能确认(或否认)吗这一点?除非你返回大型结构,并且你的编译器在优化方面完全无能为力,否则这一点真的不重要。你为什么要在意呢?第一个函数从它的签名中可以明显看出它的功能和应该使用的功能。第二个函数在不检查原始指针的情况下取消引用,应该丢弃它。如果你真的想知道是哪一个h的设置速度更快,请对它们进行分析并比较结果。除非返回大型结构,并且编译器在优化方面完全无能为力,否则这并不重要。你为什么在意?第一个函数的签名清楚地表明了它的作用和应用。第二个函数在不检查原始指针的情况下取消引用原始指针如果你真的想找出哪一种设置更快,请对它们进行分析并比较结果。
void add(int a, int *b){
     *b = a+(*b);
}