3

2 次元配列の行と列と共に 2 次元配列のアドレスを関数に渡したとします。

この関数は、2 次元配列のアドレスを 1 次元配列として扱います。(例: int マトリックス[] )

以下のコードを実行すると:

    int** arr;

    arr = new int*[row];

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

        arr[i] = new int[column];
    }
  1. 仮説として、マルチスレッド システムでは、これにより 2 次元配列に連続したメモリが割り当てられない可能性があると思います。私は正しいですか?

  2. ただし、シングルスレッドシステムでは、これにより2次元配列に連続したメモリが割り当てられると思います。私は正しいですか?もしそうなら、それは「常に」真実ですか?それともコンパイラとOSに依存しますか?

  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];
    }
    

    連続したメモリ 2 次元配列がありません。各行の要素が連続していても、行自体は次の行と連続していません。私は正しいですか?

  4. 上記のすべてが正しければ、C++ では、すべての 2 次元配列が連続したメモリであるとは限りませんよね?

4

2 に答える 2

4
  1. 真実
  2. ほとんどの場合、実装に依存する可能性が高いですが、メモリ割り当て戦略が異なると、標準で定義されている可能性が低く、異なる方法で実行される可能性があります。メモリの断片化にも依存します。
  3. 再び真実。
  4. False。最も一般的な 2D 配列は以下のとおりであり、連続したスタック メモリを持つためです。

    int my2DArr[5][5];
    
于 2013-02-20T05:38:24.423 に答える
0

あなたが言及したすべての場合において、隣接する2つの行に対して連続したメモリ位置を取得できるという保証は決してありません。これについて考えてみてください: 最初の行に N 個のメモリ セルが割り当てられた後、次の N 個のセルが占有されている場合はどうなるでしょうか? 次に、2 行目は最初の行に連続しません。ただし、2D 配列が小さい場合、このケースはまれです。

于 2013-02-20T05:40:06.260 に答える