1

pp が長さ n の構造体の配列へのポインターであるとします。[動的に割り当てられた] その構造体の配列のコピーを作成し、次の方法でそれへのポインターを作成するとします。

struct someStruct* pp2 = malloc(_appropriate_size_);
memcpy(pp2, pp, _appropriate_length_);

pp2[i]=pp[i]ループを作成してforを実行することもできます0 <= i <= n

これらのアプローチの違いは何ですか? また、どちらが優れているのですか? またその理由は何ですか?

4

3 に答える 3

1

すべてのアーキテクチャに対する決定的な答えはありません。どの方法が最適かを判断するには、プロファイリングを行う必要があります。

ただし、私見ではmemcpy、誰かが特定のアーキテクチャ/プラットフォームに時間を費やし、特定のニュアンスを使用して速度を上げることができれば、より高速になると思います。

于 2013-03-28T02:15:29.837 に答える
1

前者は、C で禁止されている識別子を使用し_ます。C99 では構造体の割り当てが合理化されたため、後者は C89 では無効です。これらの要因のいずれも問題を引き起こさないと仮定すると、機能的な違いはありません。

ベターは明確に定義されていません。「より良い」をC89でのコンパイルとして定義する場合、前者の方が優れている可能性があります。ただし、 C99 で未定義の動作がないとして「より良い」と定義する場合、後者の方が優れています。「より良い」をより最適なものとして定義すると、決定的な答えはありません。ある実装では両方のパフォーマンスが低下する可能性があり、別の実装では一方のパフォーマンスが低下し、もう一方のコードが完全に最適なコードになるか、または両方で同じコードになる可能性があるためです。とにかく、これがアルゴリズムのボトルネックになる可能性はほとんどありません...

于 2013-03-28T02:21:13.873 に答える
0

memcpy の方が高速であると言えます。通常、基盤となるプラットフォームに合わせて調整されており、DMA で開始された転送を使用する可能性があります (L1/L2 キャッシュ コピーなし)。for ループに余分な転送が含まれている可能性があります。ただし、基礎となるコンパイラがどれほど賢いかによって異なります。n に対して静的に定義された値を見つけた場合、それを memcpy に置き換える場合があります。Mystical が言及したように、ルーチンのタイミングを計るか、アセンブリ コードをチェックする価値があります。

于 2013-03-28T02:16:39.920 に答える