book · csapp · 2016-08-24 · yuex

在 C 语言中计算定义的 struct 类型的大小应该是每个 C 语言初学者绕不过的门槛。毕竟这是 一门系统编程语言,如果连自己定义的数据类型的内存大小都算不对,那么哪里还谈得上 压榨系统性能呢?struct 填充初看其实非常简单

 所有数据类型要对齐到其类型大小的内存地址上

但其实这其中还有几个点很容易被忽略。而一旦忽略了这几个点,在某些情况下就会计算 不对 struct 类型的大小

1. struct 类型的尾部要进行填充,以保证下一个连续的同类型的 struct 可以正常对齐

简言之就是,尾部要填充以保证后续地址对齐到其内含的最大的数据类型大小

2. 32 位系统以的对齐以指针大小 4 为上限

这在 64 位系统中可能感觉不深,因为最大的基本数据长度就是 8 个字节嘛。但在 32 位系统中 ,地址大小是 4 个字节,如果内含了 double 类型,需要注意这个变量是对齐到 4 而不是 8。因 为 double 大小已经超出了指针大小,会被视为复合类型而非基本类型。而在 64 位中,无论 是 double 的 8 还是 long double 的 16 都是作为基本类型对待的。

3. 嵌套 struct 的对齐也要按照 struct 基本法

一个常见的错误理解是在嵌套 struct 中将内层 struct 直接展开计算内存填充。这是不正确 的。内嵌 struct 要对齐其最大的基本类型大小上。当然,这也暗示了这个大小仍然是以指 针大小为上限的。

-EOF-