【发布时间】:2012-06-05 07:57:25
【问题描述】:
我有两个不同的数据结构,原则上它们应该具有相同的大小,我想知道为什么它们不一样。
struct pix1 {
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
unsigned char y[2];
};
struct pix2 {
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
unsigned short y;
};
然后,我将其中四个像素组合在一起,如下所示:
struct pix4 {
pix1 pixels[4]; // or pix2 pixels[4]
unsigned char mask;
};
...但事实证明,这种分组的大小会根据 sizeof(pix4) 发生变化,具体取决于我使用的是 pix1 还是 pix2。单独的 sizeof(pix1) == sizeof(pix2),所以我对为什么将四重像素分组会改变大小感到困惑。我很在意,因为用 short 编写程序比使用 2 个无符号字符更容易,但它每像素要花费我 0.25 个字节。
我不确定这个架构是否特定,因为我没有在其他类型的机器上测试过。可以对齐吗?这是我需要担心的事情,还是我可以继续进行简短的实施?
提前感谢您的帮助。
【问题讨论】:
-
#pragma pack(1) 来获得字节对齐的打包(Visual Studio),那么在这两种情况下你应该得到相同的大小。
-
正确的封装意味着你不关心确切的表示,只关心提供的接口。即使内部表示使用两个单独的字节,也很容易为
y获取并返回uint16_t的getter 和setter。 -
@Matthieu M.:你完全正确。 getter 和 setter 应该抽象出单个字节访问,但由于我不精通处理相反字节序的差异,我很担心如果我不正确地处理字节序,我会在代码中引入错误,仅此而已。
-
@Cindeselia:如果你这样做了,那么修复将本地化为 getter 和 setter 代码,这只是两个函数 :)