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

C/C++语言中struct结构体定义中__packed的作用是什么?例如代码为:typedefstruct__packedtest_s{inti;floatf;doub... C/C++语言中struct结构体定义中__packed的作用是什么?
例如代码为:
typedef struct __packed test_s
{
int i;
float f;
double d;
char c;
}test_t;
我在看外文文档中,看到有这样的代码,自己拿编译时就编译不通过,问要怎么修改呢?最好能说说__packed的作用是什么?
展开
 我来答
阿鑫聊生活
高粉答主

2020-05-14 · 生活知识分享小达人,专注于讲解生活知识。
阿鑫聊生活
采纳数:1217 获赞数:235084

向TA提问 私信TA
展开全部

packed是字节对齐的意思。

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

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

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

扩展资料:

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

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

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

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



帐号已注销
推荐于2017-09-07 · TA获得超过2326个赞
知道小有建树答主
回答量:419
采纳率:83%
帮助的人:218万
展开全部
这个你不用思考了~想不通的

__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字节对齐的意思,其它同理。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tattackor
推荐于2017-09-29 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:897万
展开全部
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字节对齐的意思,其它同理。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yangaaaa2002
2009-10-23 · TA获得超过632个赞
知道小有建树答主
回答量:221
采纳率:100%
帮助的人:206万
展开全部
用于内存对齐的,有些地方处理内存是按照一定长度作为单位的,如果你的结构体刚好不是最小单位的整数倍,你就可以用这个函数来声明自动对齐,不足的也占位
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一夜春雨万木苏
2018-10-15 · TA获得超过141个赞
知道答主
回答量:8
采纳率:0%
帮助的人:4480
展开全部
编译如果不通过,这个首先要看你的编译器是否支持,如果支持,不同编译器的格式也有点不同,你要看编译器的文档具体是如何定义和使用的 。
一般有这样的
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的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式