返回信息流做对比测试,同一个结构体在两个工程里,比对其中的数据是否一致,结果sizeof的结果差了8个字节。
对比发现是三个连续的UINT8成员的对齐方式不一样,一个工程里三个UINT8成员连续存在一个DWORD里,另一个工程分别存在三个DWORD里,VC哪个编译选项会导致这种区别?
试过了#pragma pack和__declspec(align())都没作用。
这是一条镜像帖。来源:北邮人论坛 / cpp / #85380同步于 2015/1/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]VC里同一个结构体在不同工程里怎么会有不同的size?
ariesmouse
2015/1/21镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
// 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())都没作用。
平台都一样,只是工程不同而已,结构体成员很多,为了对比方便所以把这个个结构体放到另一个工程里输出了
【 在 nuanyangyang 的大作中提到: 】
: 大小本来就是平台相关的。这也正常。
: 另外,为什么要依赖一个结构体的大小呢?
我的是2008express,不支持这个语法。而且内存排列完全是编译器自己的行为,不知道为什么在两个工程里会有这种区别,不知道环境中的那个配置导致的
【 在 gaoweiwei 的大作中提到: 】
: [code=c]
: // g++ -std=c++11 a.cpp
: struct A
: ...................
VC有个编译选项是有关内存对齐的,在项目属性了,找找吧,记不得是哪了
【 在 ariesmouse 的大作中提到: 】
: 我的是2008express,不支持这个语法。而且内存排列完全是编译器自己的行为,不知道为什么在两个工程里会有这种区别,不知道环境中的那个配置导致的