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

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

packed是字节对齐的意思。

比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17

但如果不用__packed的话,系统将以默认的方式对zhidao齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。

各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存放进行对齐,会在存取效率上带来损失。

扩展资料:

其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。



温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-07
这个你不用思考了~想不通的

__packed是字节对齐的意思。

比如说int float double char它的总大小是4 + 4 + 8 + 1 = 17
但如果你不用__packed的话,系统将以默认的方式对齐(假设是4字节),那么它占4 + 4 + 8 + 4 = 20;(不足4字节以4字节补齐)。
但在VS2008上述方法不能用了(低版本我没有试过),如果想设置对齐方式,只要选择工程属性-配置属性-C/C++-代码生成就能设置,它的选项有1、2、4、8、16。在GCC下,可以在加上#pragma pack(4) 4字节对齐的意思,其它同理。本回答被提问者采纳
第2个回答  推荐于2017-09-29
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字节对齐的意思,其它同理。
第3个回答  2009-10-23
用于内存对齐的,有些地方处理内存是按照一定长度作为单位的,如果你的结构体刚好不是最小单位的整数倍,你就可以用这个函数来声明自动对齐,不足的也占位
第4个回答  2018-10-15
编译如果不通过,这个首先要看你的编译器是否支持,如果支持,不同编译器的格式也有点不同,你要看编译器的文档具体是如何定义和使用的 。
一般有这样的
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的。
相似回答