2

(この質問は以前に回答されましたが、解決策が機能しないか、理解できません!!)
大きなサイズの行列を使用したいのです2^16*2^16が、どうすればよいですか?mallocで使用したコードは次のとおりです。

// nrows=2^16
// ncols=2^16

 int **a_matrix = (int**) malloc (nrows *sizeof(int*));

for (int i=0; i<nrows;i++)
a_matrix[i]=(int*) malloc (ncols *sizeof(int));
enter code here

今、a_matrix[55000][55000]そのセグメンテーション違反にアクセスしようとすると

スタックサイズを無制限に(いくつかのコマンドで)増やしましたが、まだ機能していません.:(それを行う他の方法はありますか?

編集: 1/0 を保存したいだけなので、bool も機能しますが、その場合も同じ問題です!

4

3 に答える 3

3

ブール値を格納したいだけの場合、パックされたビット配列を使用すると、おそらく機能するほど十分にストレージが削減されます。C++ では、std::vector<bool>またはstd::bitset;を使用します。Cで、

#include <stdint.h>

unit32_t (*a_matrix)[1<<11] = malloc((1 << 16)*sizeof *a_matrix);

malloc呼び出しが失敗しない場合)ビット配列の2^16配列へのポインターを提供します。2^16少しアクセスするには、使用します

((a_matrix[row][column >> 5]) >> (column & 0x1F)) & 1

それを関数にするのがおそらく最善です

int bit_at(int row, int col) {
    return ((a_matrix[row][col >> 5]) >> (col & 0x1F)) & 1;
}

または多分マクロ。

于 2012-10-23T20:02:44.273 に答える
2

次のように試しstd::vector<bool> matrix(0x10000L * 0x10000L);てアクセスできます。

bool b = matrix[i*0x10000 + j];

matrix[i*0x10000 + j] = true;

これは、実装のスペースの 1/8 (または 1/32 ですか?) 未満で済みます。

于 2012-10-23T19:59:17.790 に答える
0

32 ビット マシンでは 2GB (UBUNTU では 3GB) を超えるメモリを割り当てることはできません。独自malloc()のページング システムとvmm.

于 2012-10-23T19:48:10.230 に答える