2

2 つ星のプログラミングの記事を振り返ってみると、次の 2 つの行の違いの重要性を理解せずにはいられません。

*curr = entry->next;
curr = &entry->next;

私が見ることができる唯一の違いは、最初の行が次のノードを指すように変更され、2 番目の行がノード メンバー (次のループの前のノード) を指す*currまったく新しい行を作成することです。**

最初の if ブロックのエントリをfreeing すると、次のループで 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);
        }
    }
}

では、なぜ彼らは最初の方法でそれを行ったのでしょうか? パフォーマンス?他に何か不明な点はありますか?

4

2 に答える 2