C++ STD 多维数组内存布局

c++ std multidimensional array memory layout

提问人:O.Man 提问时间:12/23/2021 更新时间:12/23/2021 访问量:465

问:

定义多维 std 数组时的内存布局是什么?
它是单个连续内存块还是指针数组?

例如-

const size_t M = 5;
const size_t N = 4;
int simple_2D_array[M][N];
std::array<std::array<int,N>,M> std_2D_array;

是否保证simple_2D_arraystd_2D_array都具有与单个连续内存相同的内存布局?

C++ 多维数组 STD

评论

0赞 Shravya Boggarapu 12/23/2021
看看这个答案:stackoverflow.com/questions/4424579/...

答:

4赞 Ami Tavory 12/23/2021 #1
int simple_2D_array[M][N];

这保证在内存中是连续的。您可以使用指针算术来计算任何索引相对于起点的位置。

std::array<std::array<int,N>,M> std_2D_array;

通常,这在内存中不必是连续的。它是一个对象数组,每个对象恰好是一个数组。虽然每个内部数组在逻辑上等同于 C 样式数组作为其唯一的非静态数据成员,但编译器可以决定整个内部数组需要填充。

因此,在实践中,它可能是连续的,但依赖它可能不值得。只需编写一个迭代器或其他东西。

评论

0赞 n. m. could be an AI 12/23/2021
“您可以使用指针算术”。它实际上是未定义的行为(尽管在实践中它是有效的)。
0赞 Serge Ballesta 12/23/2021 #2

是的,但是......

首先,就像一个普通的数组周围的一个微小包装器一样,两者将具有完全相同的内存布局。std::arraysimple_2D_arraystd_2D_array

接下来,该内存布局将与大小为 20 的 1D 数组相同,但 1D 数组与任何 2D 数组之间都会有很大的区别

  • 对于一维数组,数组的声明大小是对象的总大小:例如,使用它是合法的。arr[6]
  • 对于 2D 对象,任何整数数组的声明大小仅为 4。从严格的语言角度来看,由于指针算术仅在数组中定义,因此浏览整个数组是非法的(因此是未定义的行为),就好像它是大小为 20 的一维数组一样。

当然,任何普通的编译器都会接受它并产生预期的输出,因为它曾经是一个常见的习惯用语,拒绝它会破坏很多遗留代码。然而,它不是有效的C++(我目前没有参考,但它已经在 SO 上讨论过......