结构填充并非内存浪费——它是硬件需求
发布: (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 字节。
原因在于编译器映射结构体时的布局方式。