inline体现在哪?

中才德创 2009-03-31 08:02:16
inline void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}


void bubble_sort(int ary[], int size)
{
for (int i=0; i<size; i++)
{
for (int j=i+1; j<size; j++)
{
if (ary[i] > ary[j])
{
swap(ary[i] , ary[j]);
}
}
}

}

int _tmain(int argc, _TCHAR* argv[])
{
int array[5] = {3, 2, 5, 4, 1};
bubble_sort(array, sizeof(array)/sizeof(int));
return 0;
}

/*
void swap(int &a, int &b)
22: swap(ary[i] , ary[j]);
00411458 mov eax,dword ptr [j]
0041145B mov ecx,dword ptr [ary]
0041145E lea edx,[ecx+eax*4]
00411461 push edx
00411462 mov eax,dword ptr [i]
00411465 mov ecx,dword ptr [ary]
00411468 lea edx,[ecx+eax*4]
0041146B push edx
0041146C call swap (411104h)
00411471 add esp,8

inline void swap(int &a, int &b)
22: swap(ary[i] , ary[j]);
00411418 mov eax,dword ptr [j]
0041141B mov ecx,dword ptr [ary]
0041141E lea edx,[ecx+eax*4]
00411421 push edx
00411422 mov eax,dword ptr [i]
00411425 mov ecx,dword ptr [ary]
00411428 lea edx,[ecx+eax*4]
0041142B push edx
0041142C call swap (411104h)
00411431 add esp,8

问题一:加没加inline,为什么译码是一样的呢?inline体现在哪?
*/
...全文
209 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
once_and_again 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengde007 的回复:]
内联避免了频繁调用函数对栈内存重复开辟所带来的消耗。代码当然一样。事实上,inline  在编译时,编译器是把它的原来的代码段(函数的定义部分)直接插入程序中“调用”它的地方。
[/Quote]跟静态库一样不 ?
十八道胡同 2009-04-02
  • 打赏
  • 举报
回复
inline 可以提高代码执行的速度把.
有经常调用的函数,最好成定义为inline.
xfinal2006 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 HawkOfWinter 的回复:]
在release条件下,vs2008下可以观察反汇编,有无inline都将swap代码展开。

结论:
debug下,有无inline,都不将swap代码展开。
release下,有无inline,都将swap代码展开。

为什么会是这么一个结局?
[/Quote]

debug是为了让你调试方便, 如果展开swap会增加调试的难度.
release下会有优化选项, 编译器会自动判断此函数是否合适为inline, 话说现在的VS真的越来越聪明了
firsthym 2009-04-02
  • 打赏
  • 举报
回复
优化开关没打开吧
cxxer 2009-04-02
  • 打赏
  • 举报
回复
inline只是建议,而不是强制.
「已注销」 2009-04-01
  • 打赏
  • 举报
回复
加/Ob0编译选项,就都不展开了。
还是那句:编译器决定的!
中才德创 2009-03-31
  • 打赏
  • 举报
回复
在release条件下,vs2008下可以观察反汇编,有无inline都将swap代码展开。

结论:
debug下,有无inline,都不将swap代码展开。
release下,有无inline,都将swap代码展开。

为什么会是这么一个结局?
kenstar 2009-03-31
  • 打赏
  • 举报
回复
内联可能简单地看成 "宏定义"
Paradin 2009-03-31
  • 打赏
  • 举报
回复
不行就看release的汇编
中才德创 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 aca_jingru 的回复:]
要看


void bubble_sort(int ary[], int size)
{
for (int i=0; i <size; i++)
{
for (int j=i+1; j <size; j++)
{
if (ary[i] > ary[j])
{
swap(ary[i] , ary[j]);
}
}
}

}

红色这句的汇编码
[/Quote]
当然是这一句啊!我观察它的反汇编,跟swap本身是否是inline函数,结果都是一样的。

对于inline什么地方用,什么时候用,不是我现在的观注点。
我所关注的是,为什么在VS2008环境debug条件下,却一点不能从反汇编上观察到inline的代码展开(call swap依旧存在)。
如果说,非得在release条件下,inline才将swap代码展开。由于release是不能step/stop的。
岂非我永远都观察不到inline的代码展开?
「已注销」 2009-03-31
  • 打赏
  • 举报
回复
inline只是建议编译器内联。
建议不代码执行。
VC可以用/Ob0来实现不内联
  • 打赏
  • 举报
回复
多重for里的inline很有效果啊
iam68620963 2009-03-31
  • 打赏
  • 举报
回复
兄弟,你知道类不?
使用有一类 aa 如下
aa.h
class caa
{
caa ();
void Info //成员函数 注:这时,Info默认为内联函数.内联函数与宏有些类似.就是直接把代码替换过去,从而提高效率.
{ a = 0 ; }
int a; //成员变量
}

aa.cpp

caa::caa()
{}

//使用内联函数时,需要注意,比如一个函数在你的程序中经常出现或者用到,那么你就可以把它声明为内联函数.
//内联函数的代码量尽量要少,最好控制在五十行之内.
过去的我 2009-03-31
  • 打赏
  • 举报
回复
要看


void bubble_sort(int ary[], int size)
{
for (int i=0; i <size; i++)
{
for (int j=i+1; j <size; j++)
{
if (ary[i] > ary[j])
{
swap(ary[i] , ary[j]);
}
}
}

}

红色这句的汇编码
yshuise 2009-03-31
  • 打赏
  • 举报
回复
inline对于for循环效果显著。
过去的我 2009-03-31
  • 打赏
  • 举报
回复
你用的是debug版本吧
mengde007 2009-03-31
  • 打赏
  • 举报
回复
内联避免了频繁调用函数对栈内存重复开辟所带来的消耗。代码当然一样。事实上,inline 在编译时,编译器是把它的原来的代码段(函数的定义部分)直接插入程序中“调用”它的地方。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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