c++ - 通过 const ref 传递整数类型有什么好处

标签 c++ reference

问题:通过 const 引用而不是简单地通过值传递整数类型是否有好处。

即。

void foo(const int& n); // case #1

对比

void foo(int n); // case #2

对于用户定义的类型,答案很明确,案例 #1 避免了不必要的复制,同时确保了对象的常量性。但是在上面的例子中,引用和整数(至少在我的系统上)是相同的大小,所以我无法想象函数调用需要多长时间(由于复制)。但是,我的问题确实与内联函数的编译器有关:

对于非常小的内联函数,编译器是否必须在情况 #2 中复制整数?通过让编译器知道我们不会更改引用,它可以内联函数调用而无需不必要地复制整数吗?

欢迎提出任何建议。

最佳答案

通过 const ref 传递一个内置的 int 类型实际上是一个次要的反优化(通常)。至少对于非内联函数。编译器可能必须实际传递一个必须取消引用才能获取值的指针。您可能认为它总是可以优化这一点,但别名规则和支持单独编译的需要可能会迫使编译器采取行动。

但是,对于您的次要问题:

For very small inline functions, will the compiler have to make a copy of the integer in case #2? By letting the compiler know we won't change the reference can it inline the function call without needless copying of the integer?

如果语义允许,编译器应该能够优化掉复制或取消引用,因为在那种情况下,编译器完全了解调用站点的状态和函数实现。它可能只是将值加载到寄存器中,并在完成参数后将寄存器用于其他用途。当然,这一切都非常依赖于功能的实际实现。

关于c++ - 通过 const ref 传递整数类型有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1727569/

相关文章:

c++ - 模板表达式如何摆脱临时变量

swift - 如何保证 inout 参数不会改变 Type 并且不会在函数中变成 nil

java - 如何让两个类引用同一个对象及其方法

perl 分配对子程序的引用

c++ - 为什么QStringLiteral返回乱码字符串

c++ - 在 C++ 代码 gdb 中回溯指针

c++ - 继承的成员函数的重载

c++ - 派生类的新构造函数未构建 : "overloaded member function not found"

c++ - 返回迭代器范围(主列表的子集)

C++ lambda : good reference vs. 错误引用