函数内联 inline,__inline,__forceinline

▶ 感谢大佬的总结【http://www.cnblogs.com/xuemaxiongfeng/articles/2464850.html】

● 存储限定符 __inline 与关键字 inline 的语义完全相同,不影响函数的类型,建议编译器在合理的情况下内联编译 C/C++ 函数

内联减少了函数调用的开销,但却增加了代码量

inline 仅用于 C++,__inline和 __forceinline 用于 C/C++

编译器处理内联的情况:

  ■ 使用 /clr 编译选项时,如果函数使用了安全属性,则不会进行内联

  ■ 类定义的同时定义其成员函数,则默认内联,否则也可使用 inline 指定内联

   使用__forceinline关键字,但内敛失败,则给出 level 1 警告

__forceinline 强制内联,不基于编译器的性能和优化分析而依赖于程序员的判断,仍不能内联的情况:

  ■ 函数或其调用者使用 /Ob0 编译器选项(Debug模式默认选项)

  ■ 函数和其调用者使用不同类型的异常处理。

  ■ 函数具有可变数目的参数

  ■ 函数使用了在线汇编(__asm{...}),但若开启编译选项 /Og,/Ox,/O1,/O2 则仍能内联

  ■ 是虚函数并且是虚调用,但虚函数的直接调用可以内联

  ■ 使用函数指针来对该函数进行调用

  ■ 函数被关键字 __declspec(naked) 修饰


 

inline 仅用于 C++,__inline和 __forceinline 用于 C/C++

编译器处理内联的情况:

  ■ 使用 /clr 编译选项时,如果函数使用了安全属性,则不会进行内联

  ■ 类定义的同时定义其成员函数,则默认内联,否则也可使用 inline 指定内联

   使用__forceinline关键字,但内敛失败,则给出 level 1 警告

__forceinline 强制内联,不基于编译器的性能和优化分析而依赖于程序员的判断,仍不能内联的情况:

  ■ 函数或其调用者使用 /Ob0 编译器选项(Debug模式默认选项)

  ■ 函数和其调用者使用不同类型的异常处理。

  ■ 函数具有可变数目的参数

  ■ 函数使用了在线汇编(__asm{...}),但若开启编译选项 /Og,/Ox,/O1,/O2 则仍能内联

  ■ 是虚函数并且是虚调用,但虚函数的直接调用可以内联

  ■ 使用函数指针来对该函数进行调用

  ■ 函数被关键字 __declspec(naked) 修饰


 

猜你喜欢

转载自www.cnblogs.com/cuancuancuanhao/p/10361374.html