iOS 编译器 __Attribute__ 的入门指南
作者:小朋鸟
一、Attribute
Attribute 是 GNU C 的一大特色。所以这对于 iOS 来说这是一个什么东西?
这是一个可以给对象或函数声明特性的编译器指令,目的是让编译器做更多的错误检查和优化。
可设置函数属性(Function Attribute)、变量属性(Variable Attribute)、类型属性(Type Attribute)
Swift 文档中的说明:
Attributes provide more information about a declaration or type. There are two kinds of attributes in Swift, those that apply to declarations and those that apply to types.
属性提供关于声明或类型的更多信息。Swift 中有两种属性,一种应用于声明,另一种应用于类型。
引用:Attributes
二、使用方法
以下列举一下要怎么使用,大概的场景是什么。
1、内存对齐,深度优化
2、强制内联
减少函数调用,不过要注意递归方法不能用内联。
对于以上两点,你可以永远相信编译器,除非哪一天它欺骗了你。那你再去尝试优化。
3、规范提醒
可以直接通过警告或者报错,提醒别人不能这样做!
4、语法转换
5、黑魔法
具体想做什么,可以参考下面示例。
监听变量作用域结束时,调用指定函数。
ReactiveCocoa 中 @onExit 宏的例子,SDWebImage 中也是这样的,很像 swift 中的 defer。
6、混淆加固
这可以用来做编译加固,但可能会影响到一些动态调用,要慎重。
7、声明函数不返回
表明执行完成后,函数不返回给调用方。exit() 函数是 _Noreturn 函数的一个示例,一旦调用 exit() 它不会往下执行了。
和 void 返回类型不同的是,void 类型的函数再执行完毕后返回主调函数,只是它不提供返回值。
AFNetworking 中的例子,
__attribute__((noreturn))
类似于 Swift 中的返回值类型为 Never 的函数。
8、判断检查
9、禁止衍生子类
三、clang 新增的特性
1、新的弃用声明
添加了更多参数:
introduced
首次定义deprecated
弃用版本obsoleted
废弃版本unavailable
平台无效message=string-literal
在废弃或者弃用版本的提示replacement=string-literal
该 api 的代替
2、C 中重载一个 C++函数
3、提前分配指针空间
优化大佬专用。
四、小结
Attribute 还有很多很多的使用没有列举,因为实在是太多了。
这就当是编译器前端的一点小学习笔记吧。编译器作为计算机三大浪漫之一,是没有那么容易被攻克的。
计算机三大浪漫
编译原理
操作系统
图形学
欢迎大家一起在评论区交流~
欢迎关注我们,了解更多 iOS 和行业技术的动态~
五、参考
版权声明: 本文为 InfoQ 作者【37手游iOS技术运营团队】的原创文章。
原文链接:【http://xie.infoq.cn/article/950d13db183c0a1755340bdf4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论