结构的大小看似不正确?

时间:2016-02-24 06:07:41

标签: c memory size

我在C中声明了这个结构。当我调用sizeof(struct pixel)时,我被告知这个结构的大小是12字节,当我期望它是7字节(1代表字符,4代表int) 。为什么会这样?

STRUCT:

   struct pixel {
        unsigned char red;
        unsigned char green;
        unsigned int alpha;
        unsigned char blue;
    };

3 个答案:

答案 0 :(得分: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的版本)......好吧,它们实际上只是返回了那些不良数据。 / p>

因此,对齐很重要。

答案 1 :(得分:0)

在C中,对齐结构成员以实现更快,更安全的内存访问。您的默认对齐方式为4,因此在红色绿色之后跟随2个填充字节(4个字节块完成),然后 alpha ,包含4个字节,最后一个字节蓝色再次填充为4个字节 - > 3x 4字节= 12字节。

您可以通过 pragma pack 等编译器指令更改此行为。

答案 2 :(得分:0)

正如其他几个用户所说,是一个填充问题。见this
我认为你可以减少这个结构的越少就是8个字节(在x86处理器中),要么将alpha字段放到开头或结尾