您的位置:首页 > 运维架构 > Linux

关于linux内核中的"__attribute__ ((packed))"

2015-08-28 13:50 537 查看
__attrubte__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

#define __u8 unsigned char

#define __u16 unsigned short

struct str_struct{

__u8 a;

__u8 b;

__u8 c;

__u16 d;

} __attribute__ ((packed));

typedef struct {

__u8 a;

__u8 b;

__u8 c;

__u16 d;

} __attribute__ ((packed)) str;

typedef struct {

__u8 a;

__u8 b;

__u8 c;

__u16 d;

}str_temp __attribute__ ((packed));

typedef struct {

__u8 a;

__u8 b;

__u8 c;

__u16 d;

}str_nopacked;

int main(void)

{

printf("sizeof str = %d\n", sizeof(str));

printf("sizeof str_struct = %d\n", sizeof(struct str_struct));

printf("sizeof str_temp = %d\n", sizeof(str_temp));

printf("sizeof str_nopacked = %d\n", sizeof(str_nopacked));

return 0;

}

编译运行:

引用:

[root@localhost root]# ./packedtest

sizeof str = 5

sizeof str_struct = 5

sizeof str_temp = 6

sizeof str_nopacked = 6

GNU C的一大特色就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。

__attribute__书写特征是:__attribute__前后都有两个下划线,并且后面会紧跟一对括弧,括弧里面是相应的__attribute__参数。

__attribute__语法格式为:

__attribute__ ((attribute-list))

其位置约束:放于声明的尾部“;”之前。

函数属性(Function Attribute):函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用程序做到兼容之功效。

GNU CC需要使用 –Wall编译器来击活该功能,这是控制警告信息的一个很好的方式。

packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: