与包含的类型相比,C++中的数组是如何对齐的?

sha*_*oth 21 c++ arrays

假设我有一些T必须N字节对齐的类型.现在我声明一个类型的数组T:

T array[size];
Run Code Online (Sandbox Code Playgroud)

阵列是否具有与类型相同的对齐要求,T还是具有任何其他对齐要求?

CB *_*ley 17

是的,对齐要求必须相同.显然,数组T必须至少与单个对齐,T否则其第一个成员将不能正确对齐.数组不能比其元素类型更严格地对齐这一事实遵循标准的8.3.4节,该节表示数组是连续分配的元素子对象.考虑这个数组数组:

T a[2][size];
Run Code Online (Sandbox Code Playgroud)

无论价值如何size,两个阵列之间都不会有"额外"填充a[0],a[1]否则会违反连续分配的要求.

同样,我们知道(char*)&a[1] == (char*)&a[0] + sizeof(a[0])sizeof(a[0]) == sizeof(T[size]) == size * sizeof(T).由于这适用于任何size必须可以放置T任何地址的数组,该数组适合于单个T对象(给定足够的地址空间).

  • _连续分配_要求和多维数组的使用是一个有趣的论点;我没有想到。我总是对这种间接论点有点怀疑,但在这种情况下,我认为这没有什么区别:我怀疑如果委员会没有明确禁止要求更严格的对齐,那可能是因为它没有发生对他们来说,这种情况可能存在。 (2认同)