请问,什么是内联函数啊?
不时说内联函数就是在调用的时候,编译器把函数的代码直接替换掉函数的调用么?这样就不会用压栈,call等操作了。
但是我在用visual studio2003调试的时候察看反汇编代码,还是同样有压棧,call等操作。
我的原代码是:
1、函数声明定义://下面是非内联的时候,第二种情况在void前加上inline,这里就不多写了
void func(int a, int b)
{
cout << a << b;
}
2、调用时候:
int a = 1, b = 2;
func(a, b);
--------------------
如下为两种情况的反汇编代码,问题是:他们怎么是一样的呢?哪里看出用代码替换了调用的呢??
//一般情况
12: int a = 1, b = 2;
0041B1DE mov dword ptr [a],1
0041B1E5 mov dword ptr [b],2
13: fun(a, b);
0041B1EC mov eax,dword ptr [b]
0041B1EF push eax
0041B1F0 mov ecx,dword ptr [a]
0041B1F3 push ecx
0041B1F4 call fun (41A0B8h)
0041B1F9 add esp,8
//内联情况
12: int a = 1, b = 2;
0041B18E mov dword ptr [a],1
0041B195 mov dword ptr [b],2
13: fun(a, b);
0041B19C mov eax,dword ptr [b]
0041B19F push eax
0041B1A0 mov ecx,dword ptr [a]
0041B1A3 push ecx
0041B1A4 call fun (41933Eh)
0041B1A9 add esp,8
谢谢大家,我新手!
问题点数:20、回复次数:10Top
1 楼houdy(致力于图像/图形领域,成为有思想的程序员)回复于 2006-05-04 17:56:07 得分 0
给函数前面加inline只是向编译器"推荐"这个函数最好是内联函数,但是最终的决定权还是在编译器那里,编译器会根据自己的规则来决定是否把这个函数当作内联函数处理。Top
2 楼Kshape(C/C++初学者~~~~)回复于 2006-05-04 18:48:36 得分 0
楼上的,
void func(int a, int b)
{
cout << a << b;
}
如此简单的语句,一般的编译器都会判断正确的吧:也就是,当成内联来处理。Top
3 楼longituder(大G)回复于 2006-05-04 19:01:51 得分 0
内联在debug和普通函数是一样,只有在release才展开,所以它是可调试的Top
4 楼MagicCarmack(MagiC++)回复于 2006-05-04 19:03:21 得分 0
内联只是一种申请,而不是一种保障Top
5 楼kingoffighting()回复于 2006-05-04 20:45:16 得分 0
没事别内联,咱不希罕那点速度.何况以空间为代价. 用内联函数来写库.LIB .DLL文件是兵家之大忌.Top
6 楼qhgary(Gary)回复于 2006-05-05 01:15:18 得分 0
请问楼上,为什么说“用内联函数来写库.LIB .DLL文件是兵家之大忌.”Top
7 楼pgmsoul(游侠)回复于 2006-05-05 11:17:05 得分 0
内联在debug和普通函数是一样,只有在release才展开,所以它是可调试的
这个可以设置一下.在高度优化下,如果再添上模板,反汇编就什么也看不明白了.
推荐用内联函数,咱不希罕那点空间,何况以速度为代价.
不过很多知名软件,什么都不希罕,又大又慢.
Top
8 楼pgmsoul(游侠)回复于 2006-05-05 11:19:55 得分 0
有些内联函数的体积,比不内联要小.大多如此.Top
9 楼delphihero(何去何从)回复于 2006-05-05 11:58:22 得分 0
内联函数在 release 版才展开,或者在debug里调成最大速度优化Top
10 楼nanhu_007(物是人非)回复于 2006-05-05 13:30:49 得分 0
inline函数会使lib的代码迅速膨胀,所以还是少用为妙!Top




