【发布时间】: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的数组,它公开并依赖于连续布局。)