考虑这两个功能。为什么编译器为const int&vs const int参数生成不同的代码?
int foo(const int& a) {
return a + 5;
}
int bar(const int a) {
return a + 5;
}
鉴于这些函数,g ++ - 4.9在完全优化时生成以下代码。
g++-4.9 -std=c++11 -Ofast -march=native -DNDEBUG -fno-exceptions -Wall -S -o test17.S test17.cpp
# foo
movl (%rdi), %eax
addl $5, %eax
ret
# bar
leal 5(%rdi), %eax
ret
的机器是一个x86-64的苹果。
为什么编译器会这么“注重文字”?
我的理解是C++中的引用通常是作为指针来实现的,但这并不是标准所要求的。他们最好被理解为变量的别名。细节留给实施。
鉴于引用实际上不需要指针,所以对于这两个函数都生成相同的代码似乎是一个明显的优化。为这两个函数生成const int
代码是不合法的?两个函数之间有明显的区别吗?
ABI要求将引用作为指针传递。它这样做是因为函数可能会查看其参数的地址,而不仅仅是它的值。 – 2014-10-08 18:10:31
调用者站点可能需要知道差异,所以优化需要在调用站点和被调用方法之间达成一致。看到链接器可能会涉及,这是一个难题。 – 2014-10-08 18:10:43
在多线程应用程序的上下文中可以有可观察的差异:在引用foo和返回表达式的评估之间引用的值可能会发生变化(a + 5) – 2014-10-08 18:20:55