動的多次元配列と古典的な多次元配列の使用(作成ではない)速度は、速度の点で異なりますか?
たとえば、ループを使用して3次元配列のすべての値にアクセスしようとすると、動的な方法と従来の方法で作成された配列の間に速度の違いがありますか。
「動的な3次元配列」とは、matris_cos [kuanta] [d] [angle_scale]がこのように作成されることを意味します。
matris_cos = new float**[kuanta];
for (int i = 0; i < kuanta; ++i) {
matris_cos[i] = new float*[d];
for (int j = 0; j < d; ++j)
matris_cos[i][j] = new float[angle_scale];
}
「古典的な3次元配列」とは、matris_cos [kuanta] [d] [angle_scale]がこのように単純に作成されていることを意味します。
float matris_cos[kuanta][d][angle_scale];
ただし、これらのアレイの作成速度は問いません。いくつかのループを介してこれらの配列の値にアクセスしたいと思います。値にアクセスしようとしたときに速度の違いはありますか?
ポインターの配列(ポインターの配列への)は、ランダム要素にアクセスするために追加レベルの間接参照を必要としますが、多次元配列は基本的な演算(乗算とポインターの加算)を必要とします。最近のほとんどのプラットフォームでは、キャッシュに適したアクセスパターンを使用しない限り、間接参照が遅くなる可能性があります。また、多次元配列のすべての要素が連続しているため、配列全体を反復処理するとキャッシュに役立つ可能性があります。
この違いが測定可能かどうかは、それを測定することによってのみ判断できます。
余分な間接参照がボトルネックであることが判明した場合は、ポインターの配列をクラスに置き換えて、多次元配列をフラット配列で表すことができます。
class array_3d {
size_t d1,d2,d3;
std::vector<float> flat;
public:
array_3d(size_t d1, size_t d2, size_t d3) :
d1(d1), d2(d2), d3(d3), flat(d1*d2*d3)
{}
float & operator()(size_t x, size_t y, size_t z) {
return flat[x*d2*d3 + y*d3 + z];
}
// and a similar const overload
};
次のC ++標準(来年予定)には動的なサイズの配列が含まれると思いますので、すべての場合に多次元形式を使用できるはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加