也谈内联函数

内联函数使用的 三个关键字为:

inline ,__inline ,__forceinline

在下面情况下编译器不使用内联编译:
1 函数或者调用者用选项/Ob0 编译的(Debug builds 默认选项)
2 函数或者调用者使用不同的异常处理类型(C++使用一种异常处理,结构化使用一种异常处理)
3 函数有可变的参数列表
4 函数使用内嵌汇编并且没有使用选项 /Og,/Ox,/O1,or /O2 中的一种编译。
5 函数返回一个unwindable object 并且没有使用选项/GX, /EHs, or /EHa编译。
   Unwindable Object: 一个本地对象,被分配在栈空间的,当超过了生存范围需要被释放的自动存储类的实例。
6 函数收到用一个拷贝构造对象作为值,并且没有使用选项/GX, /EHs, or /EHa 编译。
7 函数是递归的并且没有结合 #pragma(inline_recursion, on)。在 pragma 递归函数能被内联到默认的8层调用深度。对于修改内联
   深度,使用 #pragma(inline_depth, n).

在 调试版本中一般看不到内联编译的。

如下代码:

inline int max( int a , int b )
{
if( a > b ) return a;
return b;
}

调用

__asm int 3;
int a = max(100,20);

 

004010F3 push 14h
004010F5 push 64h
004010F7 call @ILT+15(max) (00401014)
004010FC add esp,8
004010FF mov dword ptr [ebp-0Ch],eax

 

在 Release 版本 中如果用调试信息的话也是看不到内联编译的。

在 Release 版本 中最终发布版本中可以看到已经内联编译了。

在其中嵌入 __asm int 3 可以调试情况下看到:

 


0040102A int 3


0040102B mov eax,64h // eax = 100
00401030 cmp eax,14h // 比较 100>20?
00401033 jle 0040103E //if > then to 0040103E
00401035 mov dword ptr [ebp-4],64h // 赋值
0040103C jmp 00401045

0040103E mov dword ptr [ebp-4],14h

 

内联函数的好处是:

1 减小栈空间大小

2 用寄存器代替了内存,提高了程序的速度

坏处:

1 增加了编译后的代码长度

2 不能使用栈回溯方式调试,增加调试难度



 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值