Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1026215
  • 博文数量: 123
  • 博客积分: 1029
  • 博客等级: 准尉
  • 技术积分: 1167
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-13 00:15
文章分类

全部博文(123)

文章存档

2014年(24)

2013年(45)

2012年(54)

分类: 嵌入式

2012-09-17 21:56:14

_attribute_((packed))
1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。
这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的。
例如:在gcc下
struct my{ char ch; int a;} 
sizeof(int)=4;sizeof(my)=8;(非紧凑模式)

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应用程序做到兼容之功效。

packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
packed是类型属性(Type Attribute)的一个参数,使用packed可以减小对象占用的空间。需要注意的是,attribute属性的效力与你的连接器也有关,如果你的连接器最大只支持16字节对齐,那么你此时定义32字节对齐也是无济于事的。

使用该属性对struct或者union类型进行定义,设定其类型的每一个变量的内存约束。
下面的例子中,my_packed_struct类型的变量数组中的值会紧凑在一起,但内部的成员变量s不会被“pack”,如果希望内部的成员变量也被packed的话,my_unpacked_struct也需要使用packed进行相应的约束。
struct my_unpacked_struct
{
     char c;
     int i;
};
          
struct my_packed_struct 
{
     char c;
     int i;
     struct my_unpacked_struct s;
}__attribute__ ((__packed__));
阅读(1878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~