【发布时间】:2013-01-20 20:28:28
【问题描述】:
如果我有这样的结构:
struct {
int a;
int b;
int values[20];
}
它会有任何类型的填充?
我已经搜索过这个问题,但是我找到的所有信息都是不同数据类型之间的填充。
【问题讨论】:
-
如果我们假设
int有一个字长,它可能不会。确定的最佳方法是使用sizeof。
如果我有这样的结构:
struct {
int a;
int b;
int values[20];
}
它会有任何类型的填充?
我已经搜索过这个问题,但是我找到的所有信息都是不同数据类型之间的填充。
【问题讨论】:
int 有一个字长,它可能不会。确定的最佳方法是使用sizeof。
它会有任何类型的填充?
我认为填充是实现定义的。然而,一个合理的解释是它不会,因为所有成员都必须为相同的字节数对齐。在我的带有 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 位 @ 987654326@ 类型,并可能提供 40 位 short long 或用于 int 不够用的情况,但 40 位 int 将是“合法的”)。
一般来说,标准要求任何类型都不能要求大于其大小的对齐,并且任何类型的数组,至少在一个结构中,具有与底层类型相同的对齐要求(某些实现可能有特殊的静态分配数组的对齐要求,例如要求任何小于页面大小的数组必须放置为不跨越页面边界,除非使用#pragma 或其他指示的其他指令进行标记,但标准是盲目的因为它们唯一可能的效果是减少程序可以声明的变量数量而不会耗尽内存)。
【讨论】: