便宜的值传递与常量引用传递

Posted

技术标签:

【中文标题】便宜的值传递与常量引用传递【英文标题】:Cheap pass by value vs pass by constant reference 【发布时间】:2020-04-11 04:02:01 【问题描述】:

特别是关于 VS 2019 上的 MSVC,廉价对象上的 const & 在最大优化下看起来像什么?有人可以肯定地说,以const & 做事至少总是无害的吗?

void foo( char );
void foo( const char & );

我知道它的实现定义了一个引用是否是一个指针,但我只想知道专门针对 MSVC 的实现,如果到处都有const & 真的很糟糕。

如果是这样,我是否应该专门使用大量使用的模板函数来传递值而不是引用大小为

【问题讨论】:

我不确定sizeof(void*) 是否是确定值是否应始终按值传递的良好基础 - 考虑到现代编译器和处理器如何使用 SIMD 执行一些奇怪的技巧来传递寄存器中的大参数(更不用说函数内联了!)。 我认为,尤其是在 2020 年,编译器应该始终弄清楚通过 const-ref 是否更好,但我对 MSVC 永远无法确定。 无论如何 - 我更担心你这样做是一个过早的微优化(which is a bad thing和never try to outsmart the compiler!) 我刚从 2 年前发现这个 - 有人试图做和你完全相同的事情:softwareengineering.stackexchange.com/questions/372105/… - 答案似乎表明(令我惊讶的是,我承认)我们应该总是更喜欢const &而不是按值,呵呵! >>> 我被教导/了解到非平凡的函数参数(即大多数非原始类型)最好通过 const 引用传递——我读过的很多书都推荐这个作为“最佳实践”。 【参考方案1】:

如果是这样,我是否应该专门使用大量使用的模板函数来传递值而不是引用大小为

一般来说,不会。模板函数几乎总是在调用的地方显示其整个定义,这意味着如果您的优化编译器(MSVC 是一个非常好的编译器)看到了机会,它不会因您选择的方式而受阻。

当然,每个规则都有例外,包括定义不可见的模板(例如使用显式实例化),以及通过函数指针而不是名称调用函数时。

99.5% 的情况下,您根本不必担心这一点。如果您想花时间在性能上,请花在性能分析上。

【讨论】:

_Ty const 存在的任何理由? @nowi:我不知道_Ty const 是什么意思。我的意思是我可以猜到它是一个模板类型,它是 const 限定的,但我不确定你在问什么。 只要是 const 的任何类型。如果_Ty const &更好那么为什么_Ty const作为参数存在 @nowi:为了与 C 兼容。当你真正想要一个副本时,你可以修改参数而不影响调用者。在少数情况下,您确实发现出于性能、安全或其他原因,最好按价值传递。

以上是关于便宜的值传递与常量引用传递的主要内容,如果未能解决你的问题,请参考以下文章

按值、常量值、引用或常量引用传递非 POD 类型

Python按值传递参数和按引用传递参数

PHP知识点--变量与常量

方法参数的值传递

c#中值类型与引用类型的值传递与引用传递

Java中的值传递与“引用传递”