C/C++语言中struct结构体定义中__packed的作用是什么?

来源:百度知道 编辑:UC知道 时间:2024/09/28 09:06:49
C/C++语言中struct结构体定义中__packed的作用是什么?
例如代码为:
typedef struct __packed test_s
{
int i;
float f;
double d;
char c;
}test_t;
我在看外文文档中,看到有这样的代码,自己拿编译时就编译不通过,问要怎么修改呢?最好能说说__packed的作用是什么?

1、__packed是字节对齐的意思。
比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17
但如果不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。
2、在VS2008上述方法不能用了,如果想设置对齐方式,只要选择工程属性-配置属性-C/C++-代码生成就能设置,它的选项有1、2、4、8、16。在GCC下,可以在加上#pragma pack(4) 4字节对齐的意思,其它同理。

编译如果不通过,这个首先要看你的编译器是否支持,如果支持,不同编译器的格式也有点不同,你要看编译器的文档具体是如何定义和使用的 。
一般有这样的
typedef __packed struck test_s
{
...
}test_t;

还有这种样子的
typedef struck __attribute__((packed)) test_s
{
...
}test_t;
其实__packed或者__attribute__((packed))关键字的作用就是用来打包数据的时候以1来对齐,你比如说用来修饰结构体或者联合体的时候,那么这些成员之间就没有间隙(gaps)了。如果没有加,那么这样结构体或者联合体就会以他的自然对齐方式来对齐。比如某CPU架构的编译器默认对齐方式是4, int的size也是4,char的size是1,那么类似
typedef __packed struck test_s
{
char a;
int b;
}test_t;
这样定义的结构体的size就是8个字节了。
如果加上packed,size就会变成5个字节,中间是没有gaps的。

这个你不用思考了~想不通的

__packed是字节对齐的意思。

比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17
但如果你不用__packed的话,系