__attribute__ ((__packed__)); 怎么用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__attribute__ ((__packed__)); 怎么用?相关的知识,希望对你有一定的参考价值。
__attribute__是GNU C对标准C语法的扩展,是GNU C的一大特色,可以用于设置函数的属性,变量的属性,类型的属性。
packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
使用该属性对 struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在 enum类型定义时,暗示了应该使用最小完整的类型 。
packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
使用该属性对 struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在 enum类型定义时,暗示了应该使用最小完整的类型 。
下面的例子中,x成员变量 使用了该属性,则其值将紧放置在a的后面:
struct test
char a;
int x[2] __attribute__ ((packed));
;
像下面的结构体,结构体的长度,就是各个变量长度的和
struct student
char name[7];
uint32_t id;
char subject[5];
__attribute__ ((packed));
下面的 例子中,my-packed-struct类型的变量数组中的值将会紧紧的靠在一起,但内部 的成员变量s不会被“pack”,如果希望内部的成员变量也被packed,my- unpacked-struct也需要使用packed进行相应的约束。
struct my_packed_struct
char c;
int i;
struct my_unpacked_struct s;
__attribute__ ( (__packed__) );
2. __packed是进行一字节对齐。使用_packed一般会以降低运行性能为代价,由于大多数cpu处理数据在合适的字节边界数的情况下会更有效,packed的使用会破坏这种自然的边界数。
typedef struct1
char x;
int y;
struct1;
typedef __packed struct2
char x;
int y;
struct2;在32位的ARM SDT编译器中
sizeof(struct1)值为8
sizeof(struct2)值为5; 参考技术B 1. __attribute__是GNU C对标准C语法的扩展,是GNU C的一大特色,可以用于设置函数的属性,变量的属性,类型的属性
packed属性:使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。
使用该属性对 struct或者union类型进行定义,设定其类型的每一个变量的内存约束。当用在 enum类型定义时,暗示了应该使用最小完整的类型 。
下面的例子中,x成员变量 使用了该属性,则其值将紧放置在a的后面:
struct test
char a;
int x[2] __attribute__ ((packed));
;
像下面的结构体,结构体的长度,就是各个变量长度的和
struct student
char name[7];
uint32_t id;
char subject[5];
__attribute__ ((packed));
下面的 例子中,my-packed-struct类型的变量数组中的值将会紧紧的靠在一起,但内部 的成员变量s不会被“pack”,如果希望内部的成员变量也被packed,my- unpacked-struct也需要使用packed进行相应的约束。
struct my_packed_struct
char c;
int i;
struct my_unpacked_struct s;
__attribute__ ( (__packed__) );
2. __packed是进行一字节对齐。使用_packed一般会以降低运行性能为代价,由于大多数cpu处理数据在合适的字节边界数的情况下会更有效,packed的使用会破坏这种自然的边界数。
typedef struct1
char x;
int y;
struct1;
typedef __packed struct2
char x;
int y;
struct2;在32位的ARM SDT编译器中
sizeof(struct1)值为8
sizeof(struct2)值为5;
STM32CUBE+KEIL+Compiler V6使用方法
可以参考:https://blog.csdn.net/PeterSun01/article/details/90445439
https://www.jianshu.com/p/18a58fee94ce
添加编译器 -D参数,并修改c/cpp编译方式
-D__weak="__attribute__((weak))" -D__packed="__attribute__((__packed__))" -D__NOINLINE="__attribute__ ( (noinline) )"
以上是关于__attribute__ ((__packed__)); 怎么用?的主要内容,如果未能解决你的问题,请参考以下文章
字段的 __attribute__((packed)) 如何影响包含该字段的结构?
如果我将字节数组转换为 __attribute__((packed, aligned(2))) 结构会发生啥?
高级C__attribute__((aligned(n))) 与 #pragma(pack(n))的区别