将输出位置的引用传递 vs 使用返回值

10

在调用提供简单数据类型的函数时,通过指针填充内存位置(通过指针传递)还是返回简单数据,哪种方法对性能更好?

这里我已经过度简化了一个返回静态值5的例子,但请假设在实际情况下确定返回值的查找/功能是动态的...

传统的逻辑告诉我第一种方法更快,因为我们通过引用操作而不需要像第二种方法那样返回副本... 但是,我希望听取其他人的意见。

谢谢

void func(int *a) { *a = 5; }

或者...

int func() { return 5; }

7个回答

8

通常情况下,如果您的函数像函数一样(即返回单个逻辑值),那么最好使用int func()。即使返回值是一个复杂的C++对象,也有一种常见的优化叫做返回值优化,它避免了不必要的对象复制,并使这两种形式在运行时性能上大致相同。


4

大多数编译器会将返回值放在寄存器中,只要你返回的值足够小可以放在寄存器里。除此之外,其他方式很少更加高效(有时几乎不可能)。


3
对于POD类型,返回值和不返回值几乎没有区别,我会始终选择返回值,因为这样更干净、更易读。
对于非POD类型,答案是“视情况而定”——很多编译器在这种情况下使用返回值优化,这往往会创建一个隐式引用参数。
然而,除非你已经测量过——而不是“知道”,而是实际上用分析工具测量过——使用返回值将函数的结果返回是否真的成为软件瓶颈,否则请使用更易读的代码版本。

2

在我看来,除非你知道有理由不这样做,或者你必须从函数中返回多个值,否则总是使用return。返回内置类型非常高效,无论与通过指针返回相比有什么差异,它都可以忽略不计。但真正的好处在于,对于后来阅读代码的人来说,使用return更加清晰和简单。


2

返回简单值就像汇编指令一样简单(例如MOV eax,xxxx),传递参数会引入更多的开销。无论如何,您不必担心这些差异,很难注意到它们。 另一个重要问题是,左侧返回函数在设计方面通常更清晰,并且在可能的情况下首选。


1

这是一个低级的东西,很难看到任何区别。


1

简单的答案是:这取决于情况。

它取决于所使用的类型,无论它们是否可以便宜地或根本不能被复制,编译器是否在某些情况下可以使用RVO,在哪种形式中更好地内联事物......

在上下文中使用合适的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接