提问人:O.Man 提问时间:12/23/2021 更新时间:12/23/2021 访问量:465
C++ STD 多维数组内存布局
c++ std multidimensional array memory layout
问:
定义多维 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_array和std_2D_array都具有与单个连续内存相同的内存布局?
答:
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::array
simple_2D_array
std_2D_array
接下来,该内存布局将与大小为 20 的 1D 数组相同,但 1D 数组与任何 2D 数组之间都会有很大的区别
- 对于一维数组,数组的声明大小是对象的总大小:例如,使用它是合法的。
arr[6]
- 对于 2D 对象,任何整数数组的声明大小仅为 4。从严格的语言角度来看,由于指针算术仅在数组中定义,因此浏览整个数组是非法的(因此是未定义的行为),就好像它是大小为 20 的一维数组一样。
当然,任何普通的编译器都会接受它并产生预期的输出,因为它曾经是一个常见的习惯用语,拒绝它会破坏很多遗留代码。然而,它不是有效的C++(我目前没有参考,但它已经在 SO 上讨论过......
评论