结构填充并非内存浪费——它是硬件需求

发布: (2026年1月1日 GMT+8 01:02)
2 min read
原文: Dev.to

Source: Dev.to

你是否曾手动计算过结构体的大小,却发现 sizeof 返回了更大的数值?这并不是你的错,也不是编译器坏了。在本指南中,我们将解码结构体填充(padding),解释它为何会出现,CPU 为什么喜欢它,以及如何在嵌入式系统中对其进行优化。

目录

结构体是什么

  • C 语言中的 结构体 是一种用户自定义的数据类型,允许程序员将不同类型的值组合在同一个名字下。
  • 结构体中的各项称为 成员,它们可以是任何合法的数据类型。
  • 结构体使用 struct 关键字定义,后跟结构体名称以及用大括号 {} 包裹的成员列表。
struct Point {
    int   x;
    int   y;
};

结构体在内存中的存储方式

考虑下面的结构体:

#include <stdio.h>

struct example {
    char a;   // 1 byte
              // 这里插入了 3 字节的填充
    int  b;   // 4 bytes
    char c;   // 1 byte
              // 这里插入了 3 字节的填充
};

int main(void) {
    printf("size of struct = %zu bytes\n", sizeof(struct example));
    return 0;
}

运行程序会输出:

size of struct = 12 bytes

尽管成员总共只有 6 字节,编译器却报告 12 字节
原因在于编译器映射结构体时的布局方式。

Back to Blog

相关文章

阅读更多 »