在调用提供简单数据类型的函数时,通过指针填充内存位置(通过指针传递)还是返回简单数据,哪种方法对性能更好?
这里我已经过度简化了一个返回静态值5的例子,但请假设在实际情况下确定返回值的查找/功能是动态的...
传统的逻辑告诉我第一种方法更快,因为我们通过引用操作而不需要像第二种方法那样返回副本... 但是,我希望听取其他人的意见。
谢谢
void func(int *a) {
*a = 5;
}
或者...
int func() {
return 5;
}
在调用提供简单数据类型的函数时,通过指针填充内存位置(通过指针传递)还是返回简单数据,哪种方法对性能更好?
这里我已经过度简化了一个返回静态值5的例子,但请假设在实际情况下确定返回值的查找/功能是动态的...
传统的逻辑告诉我第一种方法更快,因为我们通过引用操作而不需要像第二种方法那样返回副本... 但是,我希望听取其他人的意见。
谢谢
void func(int *a) {
*a = 5;
}
或者...
int func() {
return 5;
}
通常情况下,如果您的函数像函数一样(即返回单个逻辑值),那么最好使用int func()
。即使返回值是一个复杂的C++对象,也有一种常见的优化叫做返回值优化,它避免了不必要的对象复制,并使这两种形式在运行时性能上大致相同。
大多数编译器会将返回值放在寄存器中,只要你返回的值足够小可以放在寄存器里。除此之外,其他方式很少更加高效(有时几乎不可能)。
在我看来,除非你知道有理由不这样做,或者你必须从函数中返回多个值,否则总是使用return
。返回内置类型非常高效,无论与通过指针返回相比有什么差异,它都可以忽略不计。但真正的好处在于,对于后来阅读代码的人来说,使用return
更加清晰和简单。
返回简单值就像汇编指令一样简单(例如MOV eax,xxxx),传递参数会引入更多的开销。无论如何,您不必担心这些差异,很难注意到它们。 另一个重要问题是,左侧返回函数在设计方面通常更清晰,并且在可能的情况下首选。
这是一个低级的东西,很难看到任何区别。
简单的答案是:这取决于情况。
它取决于所使用的类型,无论它们是否可以便宜地或根本不能被复制,编译器是否在某些情况下可以使用RVO,在哪种形式中更好地内联事物......
在上下文中使用合适的方法。