内联函数使用的 三个关键字为:
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 不能使用栈回溯方式调试,增加调试难度