假设我将2d数组的地址及其2d数组的行和列传递给了一个函数。
该函数将把2d数组的地址视为1d数组。(例如int矩阵[])
如果我执行以下代码:
int** arr;
arr = new int*[row];
for ( int i = 0; i < row; i++ )
{
arr[i] = new int[column];
}
假设,我认为在多线程系统中,这可能不会为2d数组分配连续内存。我说得对吗?
然而,我认为在单线程系统中,这将为2d数组分配连续内存。我说得对吗?如果是这样,它"总是"是真的吗?还是取决于编译器和操作系统?
如果代码现在是这样的:
int** arr; int** arr2; arr = new int*[row]; arr2 = new int*[row]; for ( int i = 0; i < row; i++ ) { arr[i] = new int[column]; arr2[i] = new int[column]; }
我没有连续的内存2d数组。即使每一行中的元素是连续的,行本身也不会与下一行连续。我说得对吗?
如果以上都是正确的,那么在C++中,并不是每个2d数组都是连续的内存,对吧?
- 正确
- 实际上,很多时候可能是真的,可能取决于实现,不同的内存分配策略可能以不同的方式进行,不太可能是标准定义的。也取决于内存碎片
- 同样正确
-
错误,因为最典型的2D阵列如下所示,并且它将具有连续的堆栈内存
int my2DArr[5][5];
在您提到的所有情况下,都无法保证您将获得两个相邻行的连续内存位置。思考一下:如果N个存储单元被分配给第一行,然后接下来的N个单元被占用,会怎么样?那么第二行将不会与第一行相邻。但是,如果您的2D阵列很小,这种情况将很少见。