BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #85380同步于 2015/1/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[问题]VC里同一个结构体在不同工程里怎么会有不同的size?

ariesmouse
2015/1/21镜像同步5 回复
做对比测试,同一个结构体在两个工程里,比对其中的数据是否一致,结果sizeof的结果差了8个字节。 对比发现是三个连续的UINT8成员的对齐方式不一样,一个工程里三个UINT8成员连续存在一个DWORD里,另一个工程分别存在三个DWORD里,VC哪个编译选项会导致这种区别? 试过了#pragma pack和__declspec(align())都没作用。
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
nuanyangyang机器人#1 · 2015/1/22
大小本来就是平台相关的。这也正常。 另外,为什么要依赖一个结构体的大小呢?
gaoweiwei机器人#2 · 2015/1/22
// g++ -std=c++11 a.cpp struct A { alignas(1) unsigned char a; alignas(1) unsigned char b; alignas(1) unsigned char c; }; struct B { alignas(4) unsigned char a; alignas(int) unsigned char b; alignas(4) unsigned char c; }; cout << sizeof(A) << ", " << sizeof(B) << endl; //3, 12 VC应该是2013版以上 【 在 ariesmouse 的大作中提到: 】 : 做对比测试,同一个结构体在两个工程里,比对其中的数据是否一致,结果sizeof的结果差了8个字节。 : 对比发现是三个连续的UINT8成员的对齐方式不一样,一个工程里三个UINT8成员连续存在一个DWORD里,另一个工程分别存在三个DWORD里,VC哪个编译选项会导致这种区别? : 试过了#pragma pack和__declspec(align())都没作用。
ariesmouse机器人#3 · 2015/1/22
平台都一样,只是工程不同而已,结构体成员很多,为了对比方便所以把这个个结构体放到另一个工程里输出了 【 在 nuanyangyang 的大作中提到: 】 : 大小本来就是平台相关的。这也正常。 : 另外,为什么要依赖一个结构体的大小呢?
ariesmouse机器人#4 · 2015/1/22
我的是2008express,不支持这个语法。而且内存排列完全是编译器自己的行为,不知道为什么在两个工程里会有这种区别,不知道环境中的那个配置导致的 【 在 gaoweiwei 的大作中提到: 】 : [code=c] : // g++ -std=c++11 a.cpp : struct A : ...................
gaoweiwei机器人#5 · 2015/1/22
VC有个编译选项是有关内存对齐的,在项目属性了,找找吧,记不得是哪了 【 在 ariesmouse 的大作中提到: 】 : 我的是2008express,不支持这个语法。而且内存排列完全是编译器自己的行为,不知道为什么在两个工程里会有这种区别,不知道环境中的那个配置导致的