【问题标题】:Is a 3d array contiguous in memory, what about a 2d?3d 数组在内存中是连续的,那么 2d 呢?
【发布时间】:2013-10-23 17:20:39
【问题描述】:

如果我声明一个 2d c 样式数组

int data[X][Y]

我假设编译器会将其创建为类似于

的单个数组

int data[X*Y] 但这是有保证的吗?

为了简单起见,我们在 x86 架构上使用标准编译器。现在呢

int data[X][Y][Z]?

编译器是否将其创建为一个连续的内存块并只是对偏移量进行一些摆弄?

我通常将单个向量用于具有偏移行 * NumCols + col 的 2d 数组,并有一个内联函数来为我计算它,但我对这个问题的 3d 数组感兴趣。我还应该问是否有人用单个向量做到了这一点,以及偏移逻辑是什么。

【问题讨论】:

  • 标准对此还不能下定决心。一方面,它们确实要求数组是连续的,但另一方面,它们使您可以做的大多数事情都依赖于它(例如尝试使用data[0][0][Z+1])未定义的行为。
  • @JerryCoffin:我想说标准已经下定决心:数组必须是连续的并且 data[0][0][Z+1] 具有未定义的行为。 (您可以将任何对象视为unsigned char 的数组,它公开并依赖于连续布局。)

标签: c++ c arrays


【解决方案1】:

是的,C 中任意顺序的多维数组都是连续的。可以这么说,它们只是“数组的数组”。 comp.lang.c FAQ, section 6, Arrays and Pointers 的更多内容。

【讨论】:

  • 这是一个很棒的链接,顺便说一下 +1。我希望我在大学里有这个链接
【解决方案2】:

生成的数组将在分配给您的进程的虚拟内存区域中是连续的。数组在物理内存中可能不是连续的,但这对你来说并不重要。

【讨论】:

  • 虚拟内存和物理内存的区别在这里非常重要,很多其他的答案似乎都忽略了这一点。
  • 为什么重要?除非您正在编写虚拟内存系统,否则您永远不必关心差异。如果您没有虚拟内存,它们是连续的。
  • @ChristianTernus:它可以编译,但是当你运行你的程序时你会因为 SO 异常而崩溃。 “它编译”并不意味着“它是正确的”或“它会真正起作用”。您的编译器对虚拟内存一无所知,因此“测试”无关紧要。
  • @ChristianTernus:标准不要求它运行良好。您的特定实现选择优化未使用的变量,但这绝不是可移植的。
  • 使用 std::vector<std::array<...>>std::vector<std::vector<...>> 不会是连续的。
【解决方案3】:

数组中的元素保证是连续的,所以两种情况下的布局是一样的。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 2023-03-22
    • 2016-12-23
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多