[...]通过引用传递原始类型而不是按值返回是否有效率优势?
不太可能.首先,除非您的分析器中有数据表明您有其他原因,否则在设计程序时不必担心性能问题.选择最简单的设计,以及最能传达您意图的设计.
而且,原始类型的复制通常很便宜,因此这不太可能成为您应用程序的瓶颈.因为它是最简单的选项,并且使得函数的接口最清晰,所以你应该传递值.
只看一下签名,很明显一个功能如:
void foo(int);
Run Code Online (Sandbox Code Playgroud)
不会存储对参数的引用(因此,不会遇到诸如悬空引用或指针之类的问题),不会以调用者可见的方式更改参数,依此类推等等.
以上都不能从函数签名中推断出:
void f(int&); // May modify the argument! Will it? Who knows...
Run Code Online (Sandbox Code Playgroud)
甚至:
void f(int const&); // May store a reference! Will it? Who knows...
Run Code Online (Sandbox Code Playgroud)
此外,通过允许编译器执行潜在别名可能阻止的优化,传递值甚至可以提高性能.
当然,所有这一切都假设您实际上不需要修改函数内部的参数,以便在函数返回后调用者可以看到对该参数的副作用 - 或者存储对该参数的引用论点.
如果是这种情况,那么您当然应该通过引用传递并使用适当的const资格.
有关更广泛的讨论,请参阅StackOverflow上的此问答.