博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
__attribute__ ((packed)) 的作用
阅读量:6959 次
发布时间:2019-06-27

本文共 1619 字,大约阅读时间需要 5 分钟。

  hot3.png

最近在看我们的代码的时候发现声明类型的时候有 __attribute__ ((packed))的结构体类型声明,不知道是什么意思,查了下知道是如下含义:

1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。例如:

在TC下:struct my{ char ch; int a;} sizeof(int)=2;sizeof(my)=3;(紧凑模式)

在GCC下:struct my{ char ch; int a;} sizeof(int)=4;sizeof(my)=8;(非紧凑模式)

在GCC下:struct my{ char ch; int a;}__attrubte__ ((packed)) sizeof(int)=4;sizeof(my)=5

2. __attribute__关键字主要是用来在函数或数据声明中设置其属性。给函数赋给属性的主要目的在于让编译器进行优化。函数声明中的__attribute__((noreturn)),就是告诉编译器这个函数不会返回给调用者,以便编译器在优化时去掉不必要的函数返回代码。

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)是位对齐。

/* __attribute__ ((packed)) 的位置约束是放于声明的尾部“;”之前 */

struct str_struct{
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
} __attribute__ ((packed));
/* 当用到typedef时,要特别注意__attribute__ ((packed))放置的位置,相当于:
   * typedef struct str_stuct str;
   * 而struct str_struct 就是上面的那个结构。
*/
typedef struct {
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
} __attribute__ ((packed)) str;

/* 在下面这个typedef结构中,__attribute__ ((packed))放在结构名str_temp之后,其作用是被忽略的,注意与结构str的区别。*/

typedef struct {
        __u8    a;
        __u8    b;
        __u8    c;
        __u16   d;
}str_temp __attribute__ ((packed));

转载于:https://my.oschina.net/qihh/blog/91007

你可能感兴趣的文章
云计算数据中心:想好了再做
查看>>
将一些类型设计成集合模式
查看>>
吉林艺术学院监考人员被指为考生改画 学校回应
查看>>
为什么程序员应该有一台 Mac 个人电脑
查看>>
iOS 开发中 runtime 常用的几种方法
查看>>
JS执行机制(浏览器事件环 vs Node事件环)
查看>>
树形数据结构总结一(堆,Trie,并查集)
查看>>
企业上云的四个阶段
查看>>
九、 一个简单的播放器(各自同步)
查看>>
一步一图,带你了解分布式架构的前世今生!
查看>>
转行程序员深漂的这三年 #3
查看>>
[转载]责任链模式
查看>>
揭秘!双11万亿流量下的分布式缓存系统 Tair
查看>>
《图解HTTP》第4章_返回结果的HTTP状态码-思维导图
查看>>
[译] iPhone X 网页设计
查看>>
webpack入门及踩坑应对指南
查看>>
为什么你学Python效率会这么低?
查看>>
深圳晶泰科技招聘后端工程师,获腾讯Google红杉投资
查看>>
对于数据库优化的理解
查看>>
python学习三:列表、元组、字典、集合
查看>>