3d数组在内存中是连续的,那么2d呢?

bja*_*fly 7 c c++ arrays

如果我声明一个2d c风格的数组

int data[X][Y]

我假设编译器会将其创建为类似于的单个数组

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

让我们假设为简单起见,我们在x86架构上使用标准编译器.那怎么样?

int data[X][Y][Z]

编译器是否将其创建为连续的内存块,并且只是对偏移进行一些调整?

我通常使用单个向量作为带有偏移行*NumCols + col的2d数组,并且有一个内联函数来为我计算它,但我对这个问题的3d数组感兴趣.我还应该问一下是否有人用一个向量做了这个,也有偏移逻辑.

Car*_*rum 8

是的,C中任何顺序的多维数组都是连续的.他们只是"数组阵列",可以这么说.还有更多关于comp.lang.c常见问题解答,第6节,数组和指针.


jxh*_*jxh 6

生成的数组将在分配给您的进程的虚拟内存区域中连续.阵列在物理内存中可能不是连续的,但这对您来说无关紧要.

  • 它为什么如此重要?除非您正在编写虚拟内存系统,否则您永远不必关心差异.如果你没有*虚拟内存,它们*将是连续的. (4认同)
  • @ChristianTernus:它可能会编译,但是当你运行你的程序时,你会因SO异常而崩溃."它编译"并不意味着"它是正确的"或"它将实际工作".您的编译器对虚拟内存一无所知,因此"测试"无关紧要. (2认同)
  • @ChristianTernus:标准并不要求它运行良好.您的特定实现选择优化未使用的变量,但这绝不是可移植的. (2认同)