首页
社区
课程
招聘
[求助]关于内联函数
发表于: 2014-4-11 19:32 3975

[求助]关于内联函数

2014-4-11 19:32
3975
今天突然看到了内联函数这块,出于好奇心,想看看这块的原理。
所以就写了一份代码:
#include <stdio.h>
#include <windows.h>

int func(int a);

__inline int func(int a)
{
	return a*5;
}

void main()
{
	int i = 2;
	int j;
	getchar();
	j = func(i);
	printf("The int = %d",j);
}


然后在反汇编的时候发现inline在汇编里面并没有被展开,一直不得解,求教。
0040DE50  |.  83C4 04       ADD ESP,4
0040DE53  |.  8945 F4       MOV DWORD PTR SS:[EBP-C],EAX
0040DE56  |>  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]
0040DE59  |.  51            PUSH ECX
0040DE5A  |.  E8 B031FFFF   CALL constDeb.0040100F    //这里就是调用的func
0040DE5F  |.  83C4 04       ADD ESP,4
0040DE62  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
0040DE65  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0040DE68  |.  52            PUSH EDX                                 ; /<%d>
0040DE69  |.  68 1C304200   PUSH OFFSET constDeb.??_C@_0N@JANE@The?5>; |format = "The int = %d"
0040DE6E  |.  E8 9D32FFFF   CALL constDeb.printf                     ; \printf

00401050 >/> \55            PUSH EBP
00401051  |.  8BEC          MOV EBP,ESP
00401053  |.  83EC 40       SUB ESP,40
00401056  |.  53            PUSH EBX
00401057  |.  56            PUSH ESI
00401058  |.  57            PUSH EDI
00401059  |.  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]
0040105C  |.  B9 10000000   MOV ECX,10
00401061  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
00401066  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
00401068  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
0040106B  |.  6BC0 05       IMUL EAX,EAX,5
0040106E  |.  5F            POP EDI
0040106F  |.  5E            POP ESI
00401070  |.  5B            POP EBX
00401071  |.  8BE5          MOV ESP,EBP
00401073  |.  5D            POP EBP
00401074  \.  C3            RETN

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
release 版嘛?
2014-4-11 19:52
0
雪    币: 8045
活跃值: (2521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
如二楼,release才优化
2014-4-11 20:06
0
雪    币: 19
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
Thanks ...  在vc下release被优化,但是vs08还是一样。
2014-4-11 20:37
0
雪    币: 80
活跃值: (109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
__inline和iniline有什么区别?
2014-4-11 22:00
0
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
6
inline只是告诉编译器你有内嵌意向,真正是否内嵌由编译器自行决定,无论是否release。
之前看到VS有一个__forceinline的关键字,不知道能不能强制内嵌,没有实验过。
其实,真正实践中,加不加inline没有太大意义,因为编译器会在合适的时候,把非inline声明的函数直接inline,而把inline声明的函数不内嵌,这都是编译器自行决定的,这个决定在绝大多数的情况下,是正确有效的,是对程序体积上或运行时间上的最优化结果,没有必要人工干预。
2014-4-12 09:46
0
雪    币: 19
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
一样的吧?我刚查了 , inline是c99的用法,在vs08用会出错,所以用__inline。我是这么理解的。
2014-4-12 09:49
0
雪    币: 19
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
很给力的回复,得教 。 Thanks ...
2014-4-12 09:51
0
游客
登录 | 注册 方可回帖
返回
//