2

同じ長さの配列を操作する場合は、構造体を別の構造体にコピーするだけで簡単に配列をコピーできるように、配列のみを含む構造体を作成することを検討してください。

構造体の定義と宣言は次のようになります。

typedef struct {
    char array[X]; /* X is an arbitrary constant */
} Array;

Array array1;

次に、次のようにしてコピーを実行します。

Array array2;
array2 = array1;

これが配列をコピーする最速の方法であることがわかりました。不利な点はありますか?

編集: X は任意の定数です。10 としましょう。配列は可変長配列ではありません。

4

3 に答える 3

2

X は (コンパイル環境の限界まで) 任意かもしれませんが、 type のすべてのオブジェクトに対して (当然のことながら) 同じ数ですArray。同じ長さと型の多数の配列を相互にコピーする必要がある場合、これらの配列へのアクセスは通常よりも面倒になる可能性がありますが、これについて本質的に問題はありません。

Array array1;
array1.array[0] // to access the first element
于 2012-06-04T21:43:21.327 に答える
1

使用するコンパイラと最適化のレベルに完全に依存します。コンパイラはそれを一定サイズの memcpy に「縮小」し、さまざまなサイズのメモリ ブロックをコピーするために存在するマシン固有の操作に縮小する必要があります。最近の小さなブロックは、高度にマシン固有である必要があります。実際に memcpy ライブラリ関数を呼び出して 4 バイトをコピーするのは、「10 年前」です。

最適化をオフにすると、パフォーマンスへの賭けはすべてオフになります。

于 2012-06-04T22:08:37.307 に答える
1

これは問題なく動作しますがX、コンパイル時に定義する必要があるため、柔軟性に欠けます。代わりにを使用すると、任意の長さの配列で同じパフォーマンスを得ることができますmemcpy。実際、コンパイラは通常、array2 = array1への呼び出しに変換しmemcpyます。


コメントで述べたように、直接割り当てが呼び出しに変換されるかどうかはmemcpy、他のコンパイラ ヒューリスティックの中でも配列のサイズに依存します。

于 2012-06-04T21:49:05.610 に答える