动态2d阵列非连续存储器c++

Dynamic 2d Array non contiguous memory c++

本文关键字:存储器 c++ 连续 2d 阵列 动态      更新时间:2023-10-16

假设我将2d数组的地址及其2d数组的行和列传递给了一个函数。

该函数将把2d数组的地址视为1d数组。(例如int矩阵[])

如果我执行以下代码:

    int** arr;
    arr = new int*[row];
    for ( int i = 0; i < row; i++ )
    {
        arr[i] = new int[column];
    }
  1. 假设,我认为在多线程系统中,这可能不会为2d数组分配连续内存。我说得对吗?

  2. 然而,我认为在单线程系统中,这将为2d数组分配连续内存。我说得对吗?如果是这样,它"总是"是真的吗?还是取决于编译器和操作系统?

  3. 如果代码现在是这样的:

    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数组。即使每一行中的元素是连续的,行本身也不会与下一行连续。我说得对吗?

  4. 如果以上都是正确的,那么在C++中,并不是每个2d数组都是连续的内存,对吧?

  1. 正确
  2. 实际上,很多时候可能是真的,可能取决于实现,不同的内存分配策略可能以不同的方式进行,不太可能是标准定义的。也取决于内存碎片
  3. 同样正确
  4. 错误,因为最典型的2D阵列如下所示,并且它将具有连续的堆栈内存

    int my2DArr[5][5];
    

在您提到的所有情况下,都无法保证您将获得两个相邻行的连续内存位置。思考一下:如果N个存储单元被分配给第一行,然后接下来的N个单元被占用,会怎么样?那么第二行将不会与第一行相邻。但是,如果您的2D阵列很小,这种情况将很少见。