ポインタを使用して変数値を交換することが好ましい理由は、大量のメモリのコピーを回避するためです。メモリコピーには時間がかかるため、メモリコピーの量を最小限に抑えると、アルゴリズムの実行が速くなります。
メモリのコピーはどのように問題になりますか?
次の擬似コードを検討してください。これは、任意のタイプの2つの値をインプレースで交換できます。
tempValue = value1; /* first memory copy */
value1 = value2; /* second memory copy */
value2 = tempvalue; /* third memory copy */
元の質問では、2つの整数を交換しました。整数の幅が4バイトであるとすると、上記の擬似コードは3回のコピー操作で2つの整数を交換します。コピーされた合計メモリ:12バイト。ポインタの幅も4バイトであると仮定すると、ポインタ値を交換するには、12バイトのメモリもコピーする必要があります。この場合、値を交換するためにコピーされるメモリの量は、ポインタを交換するのと同じです。この場合、どちらの方法でも同じパフォーマンスが得られます。
ここで、このコードフラグメントについて考えてみましょう。
typedef struct _mystruct
{
char buffer[128]; /* size of structure becomes at least 128 bytes */
} MYSTRUCT, *PMYSTRUCT;
MYSTRUCT value1, value2;
PMYSTRUCT pValue1 = &value1;
PMYSTRUCT pValue2 = &value2;
のサイズMYSTRUCT
は少なくとも128バイトです。上記の擬似コードを使用してとの値を交換するには、128バイトの3つのメモリコピー、つまり合計384バイトが必要にvalue1
なります。value2
一方、2つのポインターを使用して値をスワップし、ポインターの幅が4バイトであるpValue1
と仮定するとpValue2
、スワップ中にコピーされるバイト数は上記の整数の例と同じです。わずか12バイト。これは、ポインタを使用しない場合の384バイトと比較すると、非常に高速で、パフォーマンスが大幅に向上します。
そのchar**
ため、文字列交換関数のパラメータとして使用されます。スワップされる文字列の長さは不明です。値のスワップはメモリのコピーを意味するため、長い文字列はパフォーマンスを大幅に低下させる可能性があります。ポインタを使用するということは、スワップされる文字列の長さに関係なく、スワッピングのパフォーマンスが同じままであることを意味します。