我发现当我在调试模式下用VS2010(我还没有检查过其他编译器)编译我的C / C ++程序时,当我查看反汇编,所有函数调用,是否为库函数,我自己的函数,类会员功能等都有两步通话。实际的函数调用被转换为call
指令到地址 A 。当我去地址 A 时,我发现它是某种大型的jmp
指令列表,每个指令都有不同的功能。它的(小)部分可能看起来像这样
fooFunc:
08CB1776 jmp fooFunc (8D11F60h)
barFunc:
08CB177B jmp barFunc (8D25240h)
std::allocator<unsigned int>::max_size:
08CB1780 jmp std::allocator<unsigned int>::max_size (8CE3D00h)
std::_Copy_backward_opt<int *,int *>:
08CB1785 jmp std::_Copy_backward_opt<int *,int *> (8D325D0h)
std::_Checked_base<int *>:
08CB178A jmp std::_Checked_base<int *> (8D32360h)
@ILT+1950(_foobarFunc):
08CB17A3 jmp foobarFunc (8F31450h)
@ILT+1955(_anotherFunc):
08CB17A8 jmp anotherFunc (8E4BD20h)
std::vector<unsigned short,std::allocator<unsigned short> >::capacity:
08CB17B2 jmp std::vector<unsigned short,std::allocator<unsigned short> >::capacity (8D8AAF0h)
yetAnother:
08CB17B7 jmp yetAnother (8D18630h)
@ILT+1975(_f):
08CB17BC jmp f (8E4FC50h)
std::_Debug_range<char *>:
08CB17C6 jmp std::_Debug_range<char *> (8D32480h)
std::_Vector_const_iterator<MyClass *,std::allocator<MyClass *> >::operator+=:
08CB17CB jmp std::_Vector_const_iterator<MyClass *,std::allocator<MyClass *> >::operator+= (8D64C80h)
这些jmp
指令依次转到实际的函数体。这仅在调试模式下进行编译时。在Release中,函数调用被编译为对函数体的直接调用。
这种间接函数调用有什么意义?
答案 0 :(得分:0)
以下是@RaptorFactor的回答:
这是由“增量链接”引起的。如果在编译器/链接器设置中禁用它,则跳转将消失。
http://msdn.microsoft.com/en-us/library/4khtbfyf(VS.80).aspx