`
fp_moon
  • 浏览: 981721 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

如果你看过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__

    ### __attribute__ 在 C 语言中的使用方法 #### 一、引言 在 C 语言中,`__attribute__` 是 GNU 编译器集合 (GCC) 的一个扩展特性,它允许开发人员向函数、变量或类型添加元数据,从而增强编译时的错误检查能力并...

    IP头_TCP头_UDP头_MAC帧头定义

    }__attribute__((packed))MAC_FRAME_HEADER, *PMAC_FRAME_HEADER; 二、IP 头结构定义 IP 头是网络协议中最重要的头部结构之一,它定义了IP数据包的结构和格式。IP 头由版本信息、头长度、服务类型、数据包长度、...

    结构体零长度数组的意义(深入)1

    } __attribute__((packed)); ``` 这个结构体的最后一个成员是可变长的数组,对于 TLV(Type-Length-Value)形式的结构,或者其他需要变长度的结构体,用这种方式定义最好。 使用这种方式定义结构体的好处是非常...

    linux 机制

    `__attribute__((packed))`则是用来取消编译器的默认优化对齐,使得结构体成员按照实际占用的字节数紧凑排列,不进行额外的填充。这在需要节省内存或者处理特定硬件时很有用,但可能会降低访问速度,因为CPU可能需要...

    temp source

    根据给定的信息,我们可以深入探讨结构体在不同编译器设置下的内存对齐与...在实际开发过程中,合理地使用`#pragma pack`指令或`__attribute__((__packed__))`属性可以有效地控制内存布局,从而实现更高效的内存使用。

    嵌入式编程规范 字节对齐

    4. **使用GCC扩展属性`__attribute__((packed))`**:该属性用于强制结构体中的所有成员紧密排列,不进行任何额外的对齐填充。 #### 实际案例分析 根据给定的部分内容,我们可以看到具体的代码示例和说明: 1. **...

    MDK5 宏定义CC_ARM

    - **__weak**、**__packed** 和 **__align** 系列宏:用于定义弱符号、内存对齐属性以及数据打包。 这些宏都是为了适配不同编译器的特性和语法差异而设计的,使得源代码能够在不同的编译环境中编译成功。 #### ...

    C 语言字节对齐

    另一种常见的做法是使用`__attribute__((packed))`来指明数据使用最小的对齐方式: ```c struct stu { char sex; int length; char name[10]; } __attribute__((packed)); struct stu my_stu; ``` 这种方式...

    字节对齐小结

    `__attribute__((packed))`则是取消默认的对齐策略,采用最小的对齐方式。 【何时设置对齐】在跨平台编程或硬件驱动开发中,确保字节对齐特别重要,因为不同的CPU架构和编译器可能会有不同的对齐要求。例如,当设计...

    c语言字节对齐

    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...

    Linux内核的数据类型.pdf

    这个结构体定义了一个SCSI设备的标识符,其中的`__attribute__((packed))`告诉编译器忽略标准对齐规则,使结构体的每一个成员都紧密地打包在一起。 ### 内存分配 Linux内核提供了动态内存分配的函数,如`get_free_...

    汽车编程-TASKING VX-toolset for ARM User Guide.pdf

    在 TASKING VX-toolset 中,用户可以使用 __unaligned、__packed__ 和 __align() 等关键字来控制变量的对齐和打包。这些关键字可以帮助用户优化代码的存储空间和性能。 绝对地址 TASKING VX-toolset 提供了 __at()...

    gcc结构体对齐.pdf

    - `__attribute__((packed))`可以用于单个结构体声明,强制结构体不进行额外的对齐填充。 4. **性能影响** - 对齐可以提高CPU访问内存的速度,特别是对于现代处理器,对齐可以避免因访问非对齐地址而产生的异常或...

    8点个求圆的夹角!!!!!!!!

    对于那些无法通过`alignas`实现的单字节对齐需求,我们可以使用平台特定的预处理器指令,如`#pragma pack(push,1)`(在MSVC下)或`__attribute__((packed))`(在GCC下),来达到目的。 总之,理解C++程序的生命周期...

    libnindex:N-Index是常见的数据存储和索引库

    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字节自然边界上。如果结构体中有...

    使用gcc和glibc来优化程序 转载.pdf

    使用`__attribute__((packed))`或`__attribute__((aligned(N)))`可以控制数据结构的对齐方式。 7. **循环优化** 通过循环展开、unrolling,减少循环迭代次数,或使用向量化(vectorization)技术,让编译器利用...

    ioctl() 函数输入输出应用实例.doc

    其中 `__attribute__((packed))` 保证了结构体成员按实际大小存储,而不是默认的对齐方式。这在某些情况下是非常重要的,尤其是在需要精确控制内存布局的情况下。 ```c #ifndef IOCTLTEST_H_ #define IOCTLTEST_...

Global site tag (gtag.js) - Google Analytics