Динамический 2d массив несмежных памяти переполнение стека

Скажем, я передал адрес 2d-массива функции вместе со строкой и столбцом 2d-массива.

Функция будет обрабатывать адрес 2d-массива как 1d-массив. (например, int matrix [])

Если я выполню код ниже:

    int** arr;

arr = new int*[row];

for ( int i = 0; i < row; i++ )
{

arr[i] = new int[column];
}
  1. Гипотетически, я думаю, что в многопоточной системе это может не выделить непрерывную память для 2-го массива. Я прав?

  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 массив является смежной памятью, верно?

2

Решение

  1. Правда
  2. Практически, вероятно, верно в большинстве случаев, вероятно, в зависимости от реализации, хотя разные стратегии выделения памяти могут идти по-разному, вряд ли они будут определены стандартом. Также зависит от фрагментации памяти.
  3. Опять правда.
  4. False, поскольку наиболее типичный 2D-массив такой, как показано ниже, и у него будет непрерывная память стека

    int my2DArr[5][5];
    
4

Другие решения

Во всех случаях, которые вы упоминаете, никогда не будет гарантии, что вы получите смежные области памяти для двух соседних строк. Подумайте об этом: что если после того, как N ячеек памяти будет выделено для первой строки, а затем будут заняты следующие N ячеек? Тогда второй ряд не будет смежным с первым рядом. Но этот случай будет редким, если ваш 2D-массив небольшой.

0