當我讀litb answer to this question時,我瞭解到通過引用傳遞數組可以讓我們獲得它的大小。我只是打點點的代碼,並試圖通過引用傳遞一個「功能」和令人驚訝的(至少對我來說),這個代碼編譯:在這種情況下,有人可以解釋「參考」和「指針」之間的區別嗎?
void execute(void (&func)()) // func is passed by reference!
{
func();
}
是否有最後一個函數之間的差異,而這一次:
void execute(void (*func)()) // func is passed by pointer!
{
func();
}
我試過使用VC2008,它在每種情況下產生不同的輸出。奇怪的是,編譯器優化的代碼更好的函數指針的情況:
void print()
{
std::cout << "Hello References!";
}
void execute(void (&func)()) // optimized
{
func();
}
int main()
{
00291020 call print (291000h)
}
=========================================
// In this case, the compiler removes all function calls in the code!
void print() // optimized!
{
std::cout << "Hello Pointers!";
}
void execute(void (*func)()) // optimized
{
func();
}
int main()
{
002F1005 push offset string "Hello References!" (2F2124h)
002F100A push eax
002F100B call std::operator<<<std::char_traits<char> > (2F1150h)
}
必須有一個區別,雖然我看不出來,是吧?
注意:代碼是使用VC2008編譯的,其中/O2
和/Ot
已打開。
編輯::我對函數引用和函數指針之間的任何差異很感興趣。我檢查了生成的彙編代碼,以瞭解每種情況下的翻譯過程。
是您在優化行爲或只是有興趣一般功能參考信息? – 2009-10-04 19:37:24
@litb我真的很驚訝我可以通過引用傳遞一個函數。如果你有關於函數指針的功能差別或其他方面的解釋,那將是非常好的:) – AraK 2009-10-04 19:51:46