c - 结构的大小看起来不正确?

标签 c memory size

我在 C 中声明了这个结构。当我调用 sizeof(struct pixel) 时,我被告知这个结构的大小是 12 字节,而我预计它是 7 字节(1 表示字符,4 表示 int)。为什么会出现这种情况?

结构:

   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 的架构)......好吧,它们实际上只是返回了错误的数据。

因此,对齐很重要。

关于c - 结构的大小看起来不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35594512/

相关文章:

java - 无法从图库中导入正常大小的图像

clang-format 可以破坏我的代码吗?

java - 这两种说法到底有什么区别

c++ - 有没有办法在多映射内联中查找键的数量?

java - 我的 Bitset 的大小是多少?

c++ - unique_ptr 的有状态自定义删除器

iOS:在初始化期间获取 View 大小

c - malloc 如何区分占用相同空间的不同类型?

c - 警告 : assignment from incompatible pointer type [enabled by default]

c - 如何传递指针并在堆上分配空间