考慮這兩個功能。爲什麼編譯器爲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