【发布时间】:2020-11-07 11:24:35
【问题描述】:
假设我在 C 中有一个结构和变量,如下所示:
typedef struct {
uint8_t x;
uint8_t y;
uint8_t z;
}my_type;
my_type a;
my_type a10[10];
用 C99 确定
-
sizeof(a) == 3? (不是 4 个或 8 个) -
sizeof(a10) == 30? (而不是 40 或 80)
【问题讨论】:
-
不,可能有填充,所以它可能而且可能会更大。
-
根据 C 标准,可以在第一个成员(与整个结构的地址相同)之后的任何位置添加填充。虽然在这种情况下实现需要添加填充并没有特别的原因,但这样做是免费的。
-
@Fredrik:它可能不会更大。除非用户的特殊要求或某些特殊目的,否则没有正常的 C 实现向此结构添加填充。 C 标准允许实现添加填充,但普通 C 实现不允许 - 随机选择的 C 实现将赋予此结构更大尺寸的概率为零或接近零。
-
@EricPostpischil ARM 的每个“普通”编译器都绝对会将其填充到四个字节,大多数 x86 编译器也会如此,除非您特别要求将其打包。 32 位对齐是常态,而不是例外。