Osc*_*hty -3 c byte struct sizeof
我知道什么是填充以及对齐是如何工作的。鉴于以下结构:
typedef struct {
char word[10];
short a;
int b;
} Test;
Run Code Online (Sandbox Code Playgroud)
我不明白 C 如何解释和对齐结构内的 char 数组。它应该是 9 个字符 + 终止符,它应该被认为是最长的,如下所示:
| - _ - _ - _ - _ - word - _ - _ - _ - _ - |
| - a - | - _ - b - _ - | padding the remaining 4 bytes
Run Code Online (Sandbox Code Playgroud)
“-”代表一个字节,“_”分隔字节。所以我们有 10 字节长的字,2 字节长的 a 和 4 字节长的 b 以及 4 字节的填充。但是当我打印 sizeof(Test) 它返回16.
编辑:我明白了。
在像这样的结构中
struct {
char word[10];
short a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
您有以下要求:
a需要一个均匀的偏移量。由于之前的字符长度为偶数,因此不需要填充。所以a位于偏移量 10。b需要一个可被 4 整除的偏移量。12 可被 4 整除,因此 12 是 的精细偏移量b。整个结构需要一个可被 4 整除的大小,因为b该结构的数组中的每个都需要具有上述要求。但由于我们目前的尺寸为 16,因此我们不需要任何填充。
WWWWWWWWWWAABBBB |-- 10 --| 2 4 = 16
将此与
struct {
char word[11];
short a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
在这里,a会有偏移量 11。这是不允许的,因此插入了填充。a偏移量为 12 就可以了。
b然后将获得 14 的偏移量,这也是不允许的,因此添加了 2 个字节。b得到 16 的偏移量。整个结构的大小为 20,这对于数组中的所有后续项都很好。
WWWWWWWWWWW.AA..BBBB
|-- 11 --|1 2 2 4 = 20
Run Code Online (Sandbox Code Playgroud)
第三个例子:
struct {
char word[11];
int b;
short a;
}
Run Code Online (Sandbox Code Playgroud)
(注意顺序更改!)
b对 12 的偏移量感到满意(它获得 1 个填充字节),
a对 16 的偏移量感到满意。(在它之前没有填充。)
然而,在结构体之后,添加了 2 个字节的填充,以便结构体与 4 对齐。
WWWWWWWWWW..BBBBAA..
|-- 10 --| 2 4 2 2 = 20
Run Code Online (Sandbox Code Playgroud)