如果我有这样的结构:
struct {
int a;
int b;
int values[20];
}
它会有任何填充吗?
我搜索过这个问题,但我发现的所有信息都是在不同数据类型之间填充。
答案 0 :(得分:1)
它会有任何填充吗?
我认为填充是实现定义的东西。然而,合理的解释是它不会,因为所有成员必须对齐相同数量的字节。事实上,这在我的Mac(OS 10.7.5)和GCC上是正确的:
(结构的大小为88字节:4 + 4 + 20 * 4,因此没有填充。)
答案 1 :(得分:1)
我认为标准在该场景中允许的唯一填充是所有int
变量共有的填充。虽然int
通常使用覆盖的unsigned char
内存位置中存在的所有位,但这不是必需的。一些数字信号处理器具有非二次幂长度的累加器,如36,40或48位(这个想法是人们经常想要将一堆32位数加在一起,其总和将超过32位;需要大于32位的累加器,但64位累加器将是大规模的过度杀伤)。具有16位存储器总线的DSP可能能够从存储器读取和写入char
值,但需要对其他所有值进行特定对齐。如果这样的DSP具有40位累加器,这样的设备可以将其int
类型存储为六个字节,其中一个将被使用(我认为这样的设备更可能使用32-位int
类型,如果short long
不够,但40位int
将是“合法的”,可能会提供40位int
或类似内容“)。
通常,标准要求任何类型都不需要大于其大小的对齐,并且任何类型的数组(至少在结构中)具有与基础类型相同的对齐要求(某些实现可能具有特殊性)静态分配数组的对齐要求,例如要求任何小于页面大小的数组必须放置,以便不跨越页面边界,除非标有#pragma或其他指示,否则标准是盲目的这样的要求,因为它们唯一可能的效果是减少程序在没有内存不足的情况下声明的变量数量。)