2016-02-24 39 views
-1

我用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; 
    }; 
+6

阅读有关[在结构填充(越少http://stackoverflow.com/问题/ 6968468 /填充式结构式-C)。 –

+0

你使用什么编译器?您是否阅读过文档? –

+0

那么,如果它是gcc,有扩展,请参阅http://stackoverflow.com/questions/8568432/is-gccs-attribute-packed-pragma-pack-unsafe – DigitalRoss

回答

2

的想法是对的速度和缓存方面的考虑,操作数应该从对准其自然大小地址读取。

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的体系结构)......呃,他们实际上只是为那些返回了不良数据。

所以,对齐很重要。

+0

感谢您的快速响应。作为一个快速的后续,反正这个结构是严格小于8个字节(我可以很容易地减少到只有8) –

+0

但是,只会返回8作为大小。有没有办法 - 有意 - 获得7个字节? –

+2

@tanishqdubey如果是GCC:[pragma pack](https://gcc.gnu.org/onlinedocs/gcc/Structure-Layout-Pragmas.html#Structure-Layout-Pragmas)。 MSVC也应该支持它。 – Youka

0

在C中,结构成员对齐的速度更快,更安全的内存访问。您的默认对齐是4,所以以后红色绿色遵循2个填充字节(4个字节块完成),然后阿尔法 4个字节和最后一个字节蓝色被填充再次成为4个字节 - > 3倍4个字节= 12个字节。

您可以通过编译指令(如编译指示包)更改此行为。

0

正如其他几个用户所指,是一个填充问题。见this
我想你可以减少这种结构是8个字节(在x86处理器),或者将α字段到开始或结束