0

巨大な malloc (通常は 8Gb 程度) を実行し、データを入力して計算を行うプログラムのアセンブリ セグメントがあります。

デバッグの目的で、この割り当てられて事前に入力されたメモリを C/C++ の 3D 配列として変換できるようにしたいと考えています。unsigned char* debug_arr[crystal_size][crystal_size][crystal_size]要素ごとのコピーを宣言して実行するとスタック オーバーフローが発生するため、特に 8 GB を割り当てたくありません。

理想的には、メモリ ポインターを 3D 配列ポインターに型キャストしたいと思います。それは可能ですか?

目的は、Assembly セグメントで実行された計算結果を検証することです。

私の C/C++ の知識は平均的です。私は主に 64 ビット アセンブリを使用しているので、C++ の型キャストを詳細に教えてください。

Env : Intel Core i7 2600K @4.4 GHz、16 GB RAM、64 ビット Windows 7 での 64 ビット アセンブリ プログラミング、Visual Studio Express 2012

ありがとう...

4

4 に答える 4

2

unsigned char3D 配列からのように 1 つのエントリにアクセスする場合は、明らかに関連する次元 (引数のためnXDimに ,nYDimと呼びnZDimます) が必要であり、書き込み中に仮定された次元の順序を知る必要があります。

z変更頻度がそれよりもy少なく、y頻度も低いと仮定すると、x次のような関数を介して配列にアクセスできます。

unsigned char* GetEntry(int nX, int nY, int nZ)
{
    return &pYourArray[(nZ * nXDim * nYDim) + (nY * nXDim) + nX];
}
于 2013-05-11T14:04:16.913 に答える
1

最初に、メモリ内でどのようなオーダーインが行われているかを確認してください。生のメジャー順または列メジャーの 2 つのタイプがあります。

For row major ordering
Address = Base + ((depthindex*col_size+colindex) * row_size + rowindex) * Element_Size
For column major ordering
Address = Base + ((rowindex*col_size+colindex) * depth_size + depthindex) * Element_Size
于 2013-05-11T14:24:21.910 に答える