C++ で double の 2 次元配列 (密な行列) を表現する方法が必要で、アクセス オーバーヘッドを最小限に抑える必要があります。
さまざまな linux/unix マシンと gcc バージョンでタイミングを計りました。次のように宣言された、ベクトルの STL ベクトル。
vector<vector<double> > matrix(n,vector<double>(n));
経由でアクセスするmatrix[i][j]
と、次のように宣言された配列よりもアクセスが 5% から 100% 遅くなります。
double *matrix = new double[n*n];
i+n*jmatrix[index(i,j)]
に評価されるインライン インデックス関数を介してアクセスされます。index(i,j)
STL を使用せずに 2 次元配列を配置する他の方法 (各行の先頭への n 個のポインターの配列、またはスタック上の全体を一定サイズとして定義するmatrix[n][n]
方法) は、インデックス関数メソッドとほぼ同じ速度で実行されます。
最近の GCC バージョン (> 4.0) では、最適化がオンになっている場合、STL ベクトルのベクトルを非 STL コードとほぼ同じ効率でコンパイルできるようですが、これは多少マシンに依存します。
可能であれば STL を使用したいのですが、最速のソリューションを選択する必要があります。GCC で STL を最適化した経験のある人はいますか?