如果我有这样的结构:
struct {
int a;
int b;
int values[20];
}
它将有任何类型的填充?
我已经搜索过这个问题,但我发现的所有信息都是不同数据类型之间的填充。
它将有任何类型的填充?
我认为填充是实现定义的。然而,一个合理的解释是它不会,因为所有成员都必须对齐相同数量的字节。在我的带有 GCC 的 Mac(OS 10.7.5)上确实如此:
(结构的大小是 88 字节:4 + 4 + 20 * 4,所以没有填充。)
我认为在这种情况下标准允许的唯一填充是所有int
变量都通用的填充。尽管通常int
使用它覆盖的内存位置中存在的所有位unsigned char
,但这不是必需的。一些数字信号处理器具有非 2 次幂长度的累加器,例如 36、40 或 48 位(这个想法是人们经常想要将一堆 32 位数字相加,其总和将超过 32 位;一个需要大于 32 位的累加器,但 64 位累加器将是巨大的矫枉过正)。具有 16 位内存总线的 DSP 可能能够char
从内存中读取和写入值,但需要对其他所有内容进行特定对齐。如果这样的 DSP 有一个 40 位的累加器,那么这样的设备可以存储它的int
类型为六个字节,其中一个将未使用(我认为这样的设备更有可能使用 32 位int
类型,并且可能会提供 40 位short long
或其他内容以应对 anint
还不够的情况,但是40 位int
将是“合法的”)。
一般来说,标准要求任何类型都不能要求大于其大小的对齐,并且任何类型的数组,至少在一个结构中,具有与底层类型相同的对齐要求(某些实现可能有特殊的对齐要求静态分配的数组,例如要求任何小于页面大小的数组必须放置在不跨越页面边界的位置,除非标有#pragma 或其他指示的其他指令,但标准对此类要求视而不见因为它们唯一可能的效果是减少程序可以声明的变量数量而不会耗尽内存)。