【发布时间】:2021-07-23 04:01:31
【问题描述】:
我在学习 C 中的结构填充时遇到了this video。
基本上它说如果我有一个结构
struct abc {
char a; // 1 byte
char b; // 1 byte
int c; // 4 bytes
} var;
那么,不要像这样存储结构体(c,...,c 表示 c 的四个字节;|| 是单词边界;_ 是字节的位置)
_ _ _ _ || _ _ _ _
a b c c c c
在b之后会填充两个字节的空白空间,结果是(e表示空)
_ _ _ _ || _ _ _ _
a b e e c c c c
这样CPU可以在一个CPU周期内得到int c。
但是,这确实建立在 struct 的第一个成员(在我的例子中为 a)将在单词边界之后立即存储的假设之上。总是这样吗?
【问题讨论】:
-
你使用的是哪个编译器?
-
你的目标是哪个 CPU?
-
听起来你感兴趣的是结构的对齐要求。
-
我觉得重要的是要注意在这里起作用的不是单词边界,而是对齐要求。即使在一个单词中也可以有填充。例如,尝试一个以
char作为第一个元素,short作为第二个元素的结构。 -
@Tony 我正在使用来自 Segger Embedded Studio 的默认 GCC。