因此,这似乎是一个非常简单的问题,但我无法在任何在线位置找到答案。我假设返回变量的函数比接受变量并更改它的函数效率低,这是因为我认为第一个函数会使用更多的内存。但是,我可能是错的,我不知道这会如何影响处理时间。
这是两个C ++示例:这个函数返回一个变量:
#include <iostream>
short getInput(){
short input;
std::cin >> input;
return input;
}
int main(){
short input = getInput();
}
您可以在其中一个中看到该程序需要创建两个输入变量,即使仅在很短的时间内创建了第二个输入变量。
这是一个通过引用传递值的函数:
#include <iostream>
short getInput(short& input){
std::cin >> input;
}
int main(){
short input;
getInput(input);
}
该示例代码段不仅更短,而且仅初始化一个short变量。我是否错了,因为它更有效。
一个小的,简单的内置类型的值,例如short
或int
几乎可以肯定会在寄存器中返回,因此它不需要创建任何内容。
如果我们将您的代码稍微简化为return 1;
,我们会希望它的主体(当我们关闭优化功能时,根本就没有任何代码),最终我们将得到这样的结果:
mov rax, 1
ret
如果返回值是不是足够小,以适应在寄存器中,那么编译器通常会在调用者分配空间,并传递给函数被调用隐藏参考该空间。换句话说,它基本上会执行与手动操作相同的操作。
长话短说,您应该以最有意义的方式编写代码。如果if函数对返回值最有意义,则返回一个值。如果通过引用更有意义,请执行此操作。
在某些情况下,修改引用的变量而不是返回值确实是有意义的。一种是用于pop
堆栈或队列中的a。如果复制返回值可能会抛出异常,那么异常安全性可能会有所不同。例如,您可以执行以下操作:
template <class T>
class queue {
std::deque<T> data;
public:
void pop(T &t) {
t = data.front();
data.pop_front();
}
};
如果尝试按值返回T,则最终可能会将该值从双端队列弹出,但是当您尝试复制返回值时,它的复制构造函数将抛出。
但是,通过这种方式,只有将复制成功复制到“返回”值中时,才从双端队列弹出该值。如果副本抛出,则该值保留在双端队列中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句