当应用于原始类型时,通过引用调用 const 是否会提高性能?

Does const call by reference improve performance when applied to primitive types?

关于对象(尤其是字符串),按引用调用比按值调用更快,因为函数调用不需要创建原始对象的副本。使用const,也可以保证引用不被滥用

我的问题是,如果使用 bool、int 或 double 等原始类型,const 按引用调用是否也更快。

void doSomething(const string & strInput, unsigned int iMode);
void doSomething(const string & strInput, const unsigned int & iMode);

我的怀疑是,一旦原始类型的字节大小超过地址值的大小,就使用按引用调用是有利的。即使差异很小,我也想利用,因为我经常调用其​​中一些函数。

附加问题:内联对我的问题的回答有影响吗?

我被教导:

  • 当参数变量是基本内置类型之一时,按值传递,例如boolint , 或 float。这些类型的对象是如此之小,以至于通过引用传递不会导致任何效率提升。另外如果你想复制一个变量。

  • 当你想有效地传递一个你不需要改变的值时,传递一个常量引用。

  • 仅当您想要更改参数变量的值时才传递引用。但尽可能避免更改参数变量。

const 是在编译时计算的关键字。它对运行时性能没有任何影响。您可以在此处阅读更多相关信息:https://isocpp.org/wiki/faq/const-correctness

My suspicion is that it is advantageous to use call-by-reference as soon as the primitive type's size in bytes exceeds the size of the address value. Even if the difference is small, I'd like to take the advantage because I call some of these functions quite often.

基于预感的性能调整在 C++ 中的工作时间约为 0%(这是我对统计数据的直觉,它通常有效...)

如果 sizeof(T) > sizeof(ptr)const T& 将小于 T 是正确的,所以通常是 32 位或 64 位,具体取决于系统..

现在问问自己:

1) 有多少内置类型大于 64 位?

2) 复制 32 位是否值得让代码变得不那么清晰?如果您的函数因为您没有向其复制 32 位值而变得明显更快,那么它可能作用不大?

3) 你真的有那么聪明吗? (剧透警报:不。)看到这个很好的答案,为什么它几乎总是一个坏主意:

最终只是按值传递。如果在(彻底的)分析之后您发现某些功能是瓶颈,并且您尝试的所有其他优化都不够(并且您应该在此之前尝试其中的大部分),pass-by-const-reference.

然后看到它没有改变任何东西。翻车哭

在 64 位架构上,没有比 pointer/reference 大的原始类型——至少在 C++11 中没有——。您应该对此进行测试,但直觉上,对于 const T&int64_t 应该有相同数量的数据混洗,而对于 sizeof(T) < sizeof(int64_t) 的任何原语应该更少。因此,就您可以衡量任何差异而言,按值传递基元应该更快如果您的编译器正在做显而易见的事情---这就是为什么我强调如果您需要确定性,你应该写一个测试用例。

另一个考虑因素是原始函数参数可以在 CPU 寄存器中结束,这使得访问它们的速度与内存访问一样快。当 T 是原语时,您可能会发现为 const T& 参数生成的指令多于为 T 参数生成的指令。您可以通过检查编译器的汇编程序输出来测试它。

除了其他答案之外,我想指出的是,当您传递引用并在您的函数中大量使用(又名取消引用)时,它可能比复制要慢。

这是因为函数的局部变量(通常)会一起加载到缓存中,但是当其中一个是 pointer/reference 并且函数使用它时,可能会导致缓存未命中。这意味着它需要转到(较慢的)主内存来获取指向的变量,这可能比制作与函数一起加载到缓存中的副本要慢。

因此,即使对于 'small objects',仅按值传递也可能更快。

(我在一本很好的书中读到过这个:Computer Systems: a programmers perspective

关于整个缓存的一些更有趣的讨论hit/miss主题:How does one write code that best utilizes the CPU cache to improve performance?