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

Deu*_*uro 9 c++ reference

问题:通过const引用传递整数类型是否有益,而不是简单地通过值传递.

即.

void foo(const int& n); // case #1
Run Code Online (Sandbox Code Playgroud)

VS

void foo(int n); // case #2
Run Code Online (Sandbox Code Playgroud)

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

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

欢迎任何建议.

Mic*_*urr 12

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

但是,对于您的第二个问题:

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

如果语义允许,编译器应该能够优化掉副本或解除引用,因为在那种情况下,编译器完全了解调用站点和函数实现的状态.它可能只是将值加载到寄存器中,并且在完成参数时只需将寄存器用于其他内容.当然,所有这些都非常依赖于函数的实际实现.


Lau*_*ves 7

这取决于编译器,但我希望任何合理的优化器都会给你相同的结果.

我用gcc测试过,结果确实相同.这是我测试的代码:

inline int foo(const int& n) {
  return n * 2;
}

int bar(int x) {
  int y = foo(x);
  return y;
}
Run Code Online (Sandbox Code Playgroud)

(有和没有const&on foo的n参数)

然后我使用以下命令行使用gcc 4.0.1编译:

g++ -O3 -S -o foo.s foo.cc
Run Code Online (Sandbox Code Playgroud)

两个编译的输出是相同的.


rlb*_*ond 6

通常不值得。即使是内联函数,编译器也不会傻。我唯一会说它合适的时候是如果你有一个模板;仅仅为了复制而不是参考而专门针对内置函数可能不值得付出额外的努力。


Nav*_*een 6

当有人像这样使用const引用作为基本数据类型时,我发现它很烦人.我无法看到这样做的任何好处,尽管可能有人认为对于大于sizeof(pointer)它的数据类型可能更有效.虽然,我真的不关心这种微小的"优化".