也谈内联函数

    技术2024-06-26  69

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

    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 14h004010F5 push 64h004010F7 call @ILT+15(max) (00401014)004010FC add esp,8004010FF mov dword ptr [ebp-0Ch],eax

     

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

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

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

     

    0040102A int 3

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

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

     

    内联函数的好处是:

    1 减小栈空间大小

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

    坏处:

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

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

     

     

    最新回复(0)