对于inline的一点疑问

March0912 2014-08-06 10:47:38
几乎所有的书上都讲inline函数在执行时是直接把函数体复制到调用处,所以提高了效率,但是我反汇编却发现无论是否用Inline修饰,都是直接call函数而并没有看到所谓的讲函数体复制到调用处,这是为什么?
以下是例子:
inline void fun(int n)
{
cout << n << endl;
}

int main(int argc, char* argv[])
{
fun(10);

return 0;
}
对应的反汇编代码:
15: int main(int argc, char* argv[])
16: {
00401780 push ebp
00401781 mov ebp,esp
00401783 sub esp,40h
00401786 push ebx
00401787 push esi
00401788 push edi
00401789 lea edi,[ebp-40h]
0040178C mov ecx,10h
00401791 mov eax,0CCCCCCCCh
00401796 rep stos dword ptr [edi]
17: fun(10);
00401798 push 0Ah
0040179A call @ILT+680(fun) (004012ad) //此处调用fun函数;
0040179F add esp,4
18:
19: return 0;
004017A2 xor eax,eax
20: }

在0040179A call @ILT+680(fun) (004012ad) 处按F11后直接到下面:
@ILT+680(?fun@@YAXH@Z):
004012AD jmp fun (004017d0)
接着F11,接到了函数里面,而并没有复制函数体内的代码:
10: inline void fun(int n)
11: {
004017D0 push ebp
004017D1 mov ebp,esp
004017D3 sub esp,40h
004017D6 push ebx
004017D7 push esi
004017D8 push edi
004017D9 lea edi,[ebp-40h]
004017DC mov ecx,10h
004017E1 mov eax,0CCCCCCCCh
004017E6 rep stos dword ptr [edi]
12: cout << n << endl;
004017E8 push offset @ILT+195(std::endl) (004010c8)
004017ED mov eax,dword ptr [ebp+8]
004017F0 push eax
004017F1 mov ecx,offset std::cout (0047c0c0)
004017F6 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)
004017FB mov ecx,eax
004017FD call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)
13: }
请高手作答!
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-07
  • 打赏
  • 举报
回复
要想强制inline请使用嵌入汇编__asm
勤奋的小游侠 2014-08-07
  • 打赏
  • 举报
回复
inline只是建议编译器做优化,用inline方式实现。 编译器不一定会听你的建议!!!!!编译器什么情况才会听你的建议用inlline实现?多点看书,effective c++ 和more effective c++这些书都有提到。 就这么简单。
KangRoger 2014-08-07
  • 打赏
  • 举报
回复
现在编译器强大,会在编译时做优化吧,及时你没有写inline也可能优化成内联函数,反之亦然
lestergyl 2014-08-07
  • 打赏
  • 举报
回复
inline是向编译器发出优化的建议,那你这个肯定是编译器没听你的建议咯,debug模式不会优化代码吧
taodm 2014-08-06
  • 打赏
  • 举报
回复
楼主听说过debug模式和release模式么? 另外,去看点好书,别浪费生命在垃圾教材上。 比如herb sutter写的《exceptional C++》系列3本。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧