找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2973|回复: 0

细数宏和内联的功与过

[复制链接]
发表于 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关键字失效时,会产生一级警告
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 17:49 , Processed in 0.029284 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表