C之attribute的作用
__attribute__的作用
attribute:属性,主要是用来在函数或数据声明中设置其属性,与编译器相关
GNU C 的一大特色就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。
语法格式为:
1 | __attribute__ ((attribute-list)) |
数据声明:
__attribute__ ((packed)): 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是 GCC 特有的语法。__attribute__((aligned(n))): 内存对齐,指定内存对齐 n 字节函数声明:
__attribute__((noreturn)): 的作用告诉编译器这个函数不会返回给调用者,以便编译器在优化时去掉不必要的函数返回代码。__attribute__((weak)): 虚函数,弱符号
packed
该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
1 | struct sc1 { |
1 | sc1: sizeof-char* = 16 |
aligned(n)
1 | struct __attribute__ ((aligned(4))) sc5 { |
运行结果:
1 | sc5: aligned 4 sizeof-char* = 16 |
noreturn
函数不会返回。
1 | extern void exit(int) __attribute__((noreturn)); |
weak
func 转成弱符号类型
- 如果遇到
强符号类型(即外部模块定义了 func,extern int func(void);),那么我们在本模块执行的 func 将会是外部模块定义的 func。 - 如果外部模块没有定义,那么将会调用这个弱符号,也就是在本地定义的 func,直接返回了一个 1(返回值视具体情况而定)相当于增加了一个
默认函数。
1 | int __attribute__((weak)) func(...) |
原理:链接器发现同时存在弱符号和强符号,就先选择强符号,如果发现不存在强符号,只存在弱符号,则选择弱符号。如果都不存在:静态链接,恭喜,编译时报错,动态链接:对不起,系统无法启动。
weak 属性只会在静态库 (.o .a) 中生效,动态库 (.so) 中不会生效。
内存地址对齐
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ansore!




