子阵列是否保证线性分配?

Jon*_*Mee 2 c++ arrays memory-layout static-allocation

我知道这个答案违反了reinterpret_cast规则,但它也假设子阵列将被线性分配.

我相信这不能保证,但是当我搜索标准时,我发现我的信心摇摆不定.如果我静态分配2D数组,如下所示:

int foo[][4] = { { 5, 7, 8 },
                 { 6, 6 },
                 {},
                 { 5, 6, 8, 9 } };
Run Code Online (Sandbox Code Playgroud)

我可以假设所有元素都将线性分配吗?也就是说,如果foo[0]是在地址0x00000042,将:

  • foo[1] 在地址0x00000052
  • foo[2] 在地址0x00000062
  • foo[3] 在地址0x00000072

这些地址是十六进制的,是的,它们为4元素子阵列提供了空间sizeof(int) == 4; 它们可能也可能不是零初始化.

eer*_*ika 5

子阵列是否保证线性分配?

是.无论数组的元素是子数组还是非数组对象,都可以保证它们在内存中连续存储.

为完整起见,这是标准报价:

[dcl.array]

  1. [snip]数组类型的对象包含一个连续分配的非空类型的N个子对象,类型为T. [snip]

T数组时没有例外.


所以我们知道这不能保证是这样的const char[4].

相反,我们知道,这保证char[4]就像它是保证其他类型的对象.

例如:const char first [] ="foo"; char foo [] [4] = {"bar","foo","","baz"}

first 会像这样存储在内存中:

{'f', 'o', 'o', '\0'}
Run Code Online (Sandbox Code Playgroud)

foo 会像这样存储:

{'b', 'a', 'r', '\0', 'f', 'o', 'o', '\0', '\0', '\0', '\0', '\0', 'b', 'a', 'z', '\0'}
Run Code Online (Sandbox Code Playgroud)

那么为什么你会说这是保证整数?

它可以保证int[4],char[4]以及您可以想象的任何其他类型.