質問: vector >(sizeX, vector(sizeY)); ``` このクラスは構造体でもあり、floatやポインタなどの組み込み関数をいくつか含んでいます。だからここには事がある: 行列のサイズが一方向に2000、他方のサイズが20であるとしますが、どちらを選択するかは自由です。最高のパフォーマンスを得るには、どれを最大にする必要がありますか `sizeX` か `sizeY` ですか? 言い換えれば、どちらが速いか、大きなベクトルの小さなベクトルか、小さなベクトルの大きなベクトルか。違いはありますか? パフォーマンスの最適化は、単一ランダムアクセスにする必要があります。
回答: ここではさまざまなことを考慮する必要があります。まず、 `sizeX * sizeY` サイズのデータの単一ベクトルを保持する独自の`行列`型を定義する方が、座標をベクトル内の要素の位置 この手法の利点は、メモリフットプリントがよりコンパクト(メモリの使用量が少ない 1 )で、メモリが連続していることです。 そのマッピングをどのように行うべきか、そして主にパフォーマンスを考慮すると、データの使用法に依存します。あなたが特定の方向に反復しようとしている場合、その方向の連続した要素をメモリ内の連続した位置にしたいとします(つまり、Y上の外部ループとX上の内部ループで反復しようとすると、 `pos = y * sizeX + x` にする必要があります。 1 Assuming that the type takes 10 bytes, a vector of 2000 vectors of 20 elements takes `(2000+1)*sizeof(vector) + 2000*20*10` bytes, a vector of 20 vectors of 2000 elements will take approximately `(20+1)*sizeof(vector) + 2000*20*10` bytes, and a single vector of `2000*20` elements takes `sizeof(vector)+2000*20*10` bytes. Roughly in a 64bit platform in release with no extra debugging information, `sizeof(vector) ~ 3*8` (i.e. 24 bytes), and the totals would be: `448024`, `400504` and `400024` bytes. That might not make that much of a difference, but in the first case there is an extra 10% memory in use, compared to the optimal case.