我用C语言声明了这个问题。当我打电话给sizeof(struct pixel)
时,我听说这个结构的大小是12字节,当我期望它是7字节的时候(chars为1,int为4)。为什么会发生?一个struct的大小看起来不正确?
结构:
struct pixel {
unsigned char red;
unsigned char green;
unsigned int alpha;
unsigned char blue;
};
我用C语言声明了这个问题。当我打电话给sizeof(struct pixel)
时,我听说这个结构的大小是12字节,当我期望它是7字节的时候(chars为1,int为4)。为什么会发生?一个struct的大小看起来不正确?
结构:
struct pixel {
unsigned char red;
unsigned char green;
unsigned int alpha;
unsigned char blue;
};
的想法是对的速度和缓存方面的考虑,操作数应该从对准其自然大小地址读取。
struct pixel {
unsigned char red; // 0
unsigned char green; // 1
unsigned int alpha; // 4 (gotta skip to an aligned offset)
unsigned char blue; // 8 (then skip 9 10 11)
};
// next offset: 12
x86架构一直能够获取未对齐的地址。然而,它比较慢,当错位重叠两个不同的缓存行时,当一个对齐的访问只会驱逐两个缓存行时,它会驱逐两个缓存行。一些体系结构实际上不得不陷入未对齐的读写操作,以及早期版本的ARM体系结构(演变成当今所有移动CPU的体系结构)......呃,他们实际上只是为那些返回了不良数据。
所以,对齐很重要。
感谢您的快速响应。作为一个快速的后续,反正这个结构是严格小于8个字节(我可以很容易地减少到只有8) –
但是,只会返回8作为大小。有没有办法 - 有意 - 获得7个字节? –
@tanishqdubey如果是GCC:[pragma pack](https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html#Structure-Layout-Pragmas)。 MSVC也应该支持它。 – Youka
在C中,结构成员对齐的速度更快,更安全的内存访问。您的默认对齐是4,所以以后红色和绿色遵循2个填充字节(4个字节块完成),然后阿尔法 4个字节和最后一个字节蓝色被填充再次成为4个字节 - > 3倍4个字节= 12个字节。
您可以通过编译指令(如编译指示包)更改此行为。
正如其他几个用户所指,是一个填充问题。见this
我想你可以减少这种结构是8个字节(在x86处理器),或者将α字段到开始或结束
阅读有关[在结构填充(越少http://stackoverflow.com/问题/ 6968468 /填充式结构式-C)。 –
你使用什么编译器?您是否阅读过文档? –
那么,如果它是gcc,有扩展,请参阅http://stackoverflow.com/questions/8568432/is-gccs-attribute-packed-pragma-pack-unsafe – DigitalRoss