2 つ星のプログラミングの記事を振り返ってみると、次の 2 つの行の違いの重要性を理解せずにはいられません。
*curr = entry->next;
curr = &entry->next;
私が見ることができる唯一の違いは、最初の行が次のノードを指すように変更され、2 番目の行がノード メンバー (次のループの前のノード) を指す*curr
まったく新しい行を作成することです。**
最初の if ブロックのエントリをfree
ing すると、次のループで 2 行目が適切に機能しなくなることが思い浮かびますが、その場合、両方のケースで最初の行を使用しないのはなぜですか? それはパフォーマンスの問題ですか?
編集:上記のリンクの「2 つ星プログラミング」というタイトルの 2 番目のコード ブロックをお読みください。
編集:説明が不十分だったようです (申し訳ありません!) ので、もう少し詳しく説明できるかどうか見てみましょう。
記事内のソースコードです。
void remove_if(node ** head, remove_fn rm)
{
for (node** curr = head; *curr; )
{
node * entry = *curr;
if (rm(entry))
{
*curr = entry->next;
free(entry);
}
else
curr = &entry->next;
}
}
私の推測では、curr = &entry->next;
行は必要ありません。他の 2 回を使用できます。
void remove_if(node ** head, remove_fn rm)
{
for (node** curr = head; *curr; )
{
node * entry = *curr;
if (rm(entry))
{
*curr = entry->next;
free(entry);
}
else
*curr = entry->next;
}
}
次に、if ステートメントの上に移動して、数行を節約できます。
void remove_if(node ** head, remove_fn rm)
{
for (node** curr = head; *curr; )
{
node * entry = *curr;
*curr = entry->next;
if (rm(entry))
{
free(entry);
}
}
}
実際、ポインターポインターはまったく必要ないようで、これを実行できます。
void remove_if(node * head, remove_fn rm)
{
for (node* curr = head; curr; )
{
node * entry = curr;
curr = entry->next;
if (rm(entry))
{
free(entry);
}
}
}
では、なぜ彼らは最初の方法でそれを行ったのでしょうか? パフォーマンス?他に何か不明な点はありますか?