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)是位对齐。
如果你看过GPSR协议在TinyOS中的实现,你一定会注意到下面的语句: typedef struct { double x; double y; } __attribute__((packed)) position_t;
开始我们还可以理解,不久是定义一个结构体嘛!不过看到后面的语句,你可能就会一头雾水了,’ __attribute__((packed))’是什么东西?有什么作用?一连串的疑问马上就会从你脑袋里冒出来。虽然这个对理解整个程序没有什么影响,但我不想让这些疑问一直呆在我的脑子里,负担太重。省得以后念念不忘,而且也许有一天可以用的上呢。搞清楚这个问题吧!
GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。 __attribute__语法格式为: __attribute__ ((attribute-list))
其位置约束为:放于声明的尾部“;”之前。
packed是类型属性(Type Attribute)的一个参数,使用packed可以减小对象占用的空间。需要注意的是,attribute属性的效力与你的连接器也有关,如果你的连接器最大只支持16字节对齐,那么你此时定义32字节对齐也是无济于事的。
使用该属性对struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在enum类型定义时,暗示了应该使用最小完整的类型(it indicates that the smallest integral type should be used)。
下面的例子中,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));
__attribute__机制的详细介绍请参考:
http://www.unixwiz.net/techtips/gnu-c-attributes.html
|
http://hi.baidu.com/5id0/blog/item/95916dd99a4d27c939012fbe.html
分享到:
相关推荐
### __attribute__ 在 C 语言中的使用方法 #### 一、引言 在 C 语言中,`__attribute__` 是 GNU 编译器集合 (GCC) 的一个扩展特性,它允许开发人员向函数、变量或类型添加元数据,从而增强编译时的错误检查能力并...
}__attribute__((packed))MAC_FRAME_HEADER, *PMAC_FRAME_HEADER; 二、IP 头结构定义 IP 头是网络协议中最重要的头部结构之一,它定义了IP数据包的结构和格式。IP 头由版本信息、头长度、服务类型、数据包长度、...
} __attribute__((packed)); ``` 这个结构体的最后一个成员是可变长的数组,对于 TLV(Type-Length-Value)形式的结构,或者其他需要变长度的结构体,用这种方式定义最好。 使用这种方式定义结构体的好处是非常...
`__attribute__((packed))`则是用来取消编译器的默认优化对齐,使得结构体成员按照实际占用的字节数紧凑排列,不进行额外的填充。这在需要节省内存或者处理特定硬件时很有用,但可能会降低访问速度,因为CPU可能需要...
根据给定的信息,我们可以深入探讨结构体在不同编译器设置下的内存对齐与...在实际开发过程中,合理地使用`#pragma pack`指令或`__attribute__((__packed__))`属性可以有效地控制内存布局,从而实现更高效的内存使用。
4. **使用GCC扩展属性`__attribute__((packed))`**:该属性用于强制结构体中的所有成员紧密排列,不进行任何额外的对齐填充。 #### 实际案例分析 根据给定的部分内容,我们可以看到具体的代码示例和说明: 1. **...
- **__weak**、**__packed** 和 **__align** 系列宏:用于定义弱符号、内存对齐属性以及数据打包。 这些宏都是为了适配不同编译器的特性和语法差异而设计的,使得源代码能够在不同的编译环境中编译成功。 #### ...
另一种常见的做法是使用`__attribute__((packed))`来指明数据使用最小的对齐方式: ```c struct stu { char sex; int length; char name[10]; } __attribute__((packed)); struct stu my_stu; ``` 这种方式...
`__attribute__((packed))`则是取消默认的对齐策略,采用最小的对齐方式。 【何时设置对齐】在跨平台编程或硬件驱动开发中,确保字节对齐特别重要,因为不同的CPU架构和编译器可能会有不同的对齐要求。例如,当设计...
2. **使用`__attribute__((packed))`**:该属性指示编译器不执行任何额外的对齐操作,从而使结构体成员尽可能紧密排列,通常用于节省空间。 ```c struct Student { char sex; int length; char name[10]; } __...
定义结构体我没有注意到数据对齐,因为在底层实现中,我传入的数据buffer是排列整齐的,而强制转化的结构体格式中,我定义的时候没有使用__attribute__((__packed__))或者__packed强制数据对齐,导致结构体成员真实...
- **属性修饰符**:在GCC中,可以使用`__attribute__((aligned(n)))`来指定结构成员对齐在`n`字节边界,而`__attribute__((packed))`则取消结构的默认对齐,按照实际占用字节数对齐。 4. **实例分析**: - 示例1...
这个结构体定义了一个SCSI设备的标识符,其中的`__attribute__((packed))`告诉编译器忽略标准对齐规则,使结构体的每一个成员都紧密地打包在一起。 ### 内存分配 Linux内核提供了动态内存分配的函数,如`get_free_...
在 TASKING VX-toolset 中,用户可以使用 __unaligned、__packed__ 和 __align() 等关键字来控制变量的对齐和打包。这些关键字可以帮助用户优化代码的存储空间和性能。 绝对地址 TASKING VX-toolset 提供了 __at()...
- `__attribute__((packed))`可以用于单个结构体声明,强制结构体不进行额外的对齐填充。 4. **性能影响** - 对齐可以提高CPU访问内存的速度,特别是对于现代处理器,对齐可以避免因访问非对齐地址而产生的异常或...
对于那些无法通过`alignas`实现的单字节对齐需求,我们可以使用平台特定的预处理器指令,如`#pragma pack(push,1)`(在MSVC下)或`__attribute__((packed))`(在GCC下),来达到目的。 总之,理解C++程序的生命周期...
N索引库 N-Index是通用数据索引和存储库。... } __attribute__((packed)); // load hash table; HashTable<MyKey> ht = HashTable<MyKey>::LoadHashTable(...); // initialize key MyKey key; memset (&key, 0
四、GNU C中的__attribute__((aligned (n)))和__attribute__ ((packed)) GNU C提供了两种方式来控制结构体成员的对齐方式。__attribute__((aligned (n)))可以让结构体成员对齐在n字节自然边界上。如果结构体中有...
使用`__attribute__((packed))`或`__attribute__((aligned(N)))`可以控制数据结构的对齐方式。 7. **循环优化** 通过循环展开、unrolling,减少循环迭代次数,或使用向量化(vectorization)技术,让编译器利用...
其中 `__attribute__((packed))` 保证了结构体成员按实际大小存储,而不是默认的对齐方式。这在某些情况下是非常重要的,尤其是在需要精确控制内存布局的情况下。 ```c #ifndef IOCTLTEST_H_ #define IOCTLTEST_...