元始天尊 发表于 2014-10-11 00:00:16

细数宏和内联的功与过

C++提供了新特性以增强类型安全和语言的可预测性:
1.C++中const对象可以用于常量表达式中,这就允许定义含有类型信息、值信息和枚举类型这些被编译器认为是符号的常量了。通常使用#define并不能精确定义类型,同时只要不使用该常对象指针,该对象就不会占用存储空间。
2.C++内联函数体功能了函数式宏,内敛函数相比宏有以下优点:
*是类型安全的,内联函数和普通函数一样会进行类型检查,而宏不是类型安全的
*检查不安全参数,在进入函数体时作为参数的表达式会首先进行检查

内联函数有3个关键字:inline __inline __forceinline后2个是微软编译器所支持的,且只用于C++
始终记住内联只是一种请求,只有编译器进行收益损耗分析并通过后,内联才能成功,即使使用__forceinline也不能确保一定内联。
内联展开有助于缓解较大体积代码产生的过度调用
__forceinline关键字相当于将编译器的收益损耗分析归于程序员判断,误用__forceinline可能产生低效和较大体积的代码。
使用内联可以使程序运行更快,因为不存在函数调用开销。

在以下情况inline关键字失效:
1.递归
2.在编译单元的其他地方通过指针引用该函数

在以下情况__forceinline关键字失效
1.使用/Ob0编译
2.函数和调用者使用不同类型的异常处理(一个使用C++异常处理,一个使用SEH)
3.函数有变参
4.函数使用内联汇编且没有使用/Og,/Ox,/O1或/O2编译
5.函数递归,且没有指定#pragma inline_recursion(on).若指定了pragma,递归函数最多可以内联16层调用(该层数可以使用inline_depth指定),16层之后,递归函数调用被视为普通函数调用
6.为虚函数且为虚调用,直接调用虚函数可以内联
7.通过函数指针进行调用
8。指定了_declspec(naked)修饰符

在__forceinline关键字失效时,会产生一级警告
页: [1]
查看完整版本: 细数宏和内联的功与过