【问题标题】:c++ std multidimensional array memory layoutc++ std多维数组内存布局
【发布时间】:2022-01-24 06:41:46
【问题描述】:

定义多维 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++ arrays multidimensional-array std


【解决方案1】:
int simple_2D_array[M][N];

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

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

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

因此,在实践中,它可能是连续的,但依赖它可能并不值得。写一个迭代器什么的就行了。

【讨论】:

  • “你可以使用指针算法”。它实际上是未定义的行为(尽管在实践中它有效)。
【解决方案2】:

是的,但是……

首先,由于std::array 只是一个简单数组的小包装,simple_2D_arraystd_2D_array 将具有完全相同的内存布局。

接下来,该内存布局将与大小为 20 的一维数组中的一个相同一维数组与任何二维数组之间存在很大差异

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2019-03-03
    • 2019-05-02
    • 2019-08-30
    • 1970-01-01
    相关资源
    最近更新 更多