__attribute__
_attribute__是GCC编译器提供的一种语法扩展,用于指定变量、函数、结构体等的属性。通过__attribute__可以告诉编译器一些额外的信息,从而优化代码或生成更好的代码。
attribute 书写特征是:attribute 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。attribute 语法格式为:attribute ((attribute-list))
1. __attribute__((packed))
这个属性告诉编译器取消结构体中成员之间的内存对齐,使得结构体的大小最小。这个属性通常用于网络编程中,将数据封装成二进制流传输时可以减小数据的大小。
示例代码:
struct __attribute__((packed)) Person { char name[20]; int age; };
2. __attribute__((noreturn))
noreturn 为函数声明,无返回值。 这个属性用于告诉编译器函数不会返回,比如exit函数和abort函数。这样编译器就可以在函数调用点后面省略一些代码,以提高程序运行效率。
示例代码:
void __attribute__((noreturn)) my_exit(int status) { // 执行一些清理工作 exit(status); }
如果不加 __attribute__((noreturn)); ,运行 gcc -Wall 当前源文件.c。因为加了 -Wall , 所以会有警告信息.
现在加 __attribute__((noreturn)); 警告信息也不会有了。
3. __attribute__((aligned(n)))
这个属性告诉编译器变量需要按照n字节对齐。n必须是2的幂,通常是2、4、8或16字节。这个属性可以用于优化内存访问的效率,但是会增加内存的消耗。
示例代码:
int __attribute__((aligned(16))) a[4];
4. __attribute__((section('name')))
这个属性用于将变量或函数放到指定的段(section)中。段是一种内存区域,程序在运行时可以根据需要将段加载到内存中。这个属性通常用于嵌入式系统的开发,可以将一些特定的代码和数据放到特定的段中,以便于管理和使用。
示例代码:
#define MACHINE_START(_type,_name) \ static const struct machine_desc __mach_desc_##_type \ __used \ __attribute__((__section__(".arch.info.init"))) = { \ .nr = MACH_TYPE_##_type, \ .name = _name, #define MACHINE_END
5. __attribute__((weak))
这个属性用于将函数或变量声明为弱符号。弱符号在链接过程中优先选择强符号,如果没有强符号则使用弱符号。这个属性通常用于编写可插拔的代码,可以在编译时选择使用特定的函数或变量。
示例代码:
int __attribute__((weak)) c = 0;
扩展内建函数
内建,即编译器自带的,不需要引入头文件,如 int、main 、struct 都是内建的。
内建函数也是如此,函数是编译器自带的,不需要引入头文件,主要用于性能优化。
以下的 C 标准库函数,其实都是内建函数,不需要引入头文件即可使用。
- 内存相关函数:memcpy 、memset、memcmp
- 数学函数:log、cos、abs、exp、
- 字符串处理函数:strcat、 strcmp、strcpy 、 strlen
- 打印函数:printf、scanf、putchar、puts
条件是,加前缀 __builtin_。
如:__builtin_puts( )、__builtin_memcpy( ),有一些出于安全、性能方面考虑,参数个数和 C 标准库函数不太一样,因为 C 标准库函数的函数不安全,如 strcpy() 、memcpy( )、scanf( )、gets( )。