当我阅读这个问题的litb答案时,我了解到通过引用传递数组可以获取其大小。我尝试通过引用传递一个“函数”,令人惊讶的是(至少对我来说),这段代码可以编译:
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
选项。
编辑:我非常想知道函数引用和函数指针之间的区别。我检查了生成的汇编代码,只是为了看看在每种情况下它是如何转换的。