-2

タスクレットのソースコードを読んで理解しようとしています。

tasklet_head のデータ構造はワイヤードだと思いますが、そうですか。2 番目の要素のデータ型が struct tasklet_struct ** である理由は、ソース コードをより複雑にし、人々を混乱させるだけです。つまり、作成者は struct tasklet_struct *tail を使用しないのはなぜですか? おそらく作者はとても頭がいいので、この種の単純さは理解できません。本当なら、わかる方、何かヒントをいただけませんか。

398 /*
399  * Tasklets
400  */
401 struct tasklet_head
402 {
403         struct tasklet_struct *head;
404         struct tasklet_struct **tail;
405 };

完全なソース コードはここにあります。

4

1 に答える 1

0

プログラミングに関する質問にお答えします。

もちろん、*tail と **tail はまったく別のものであり、それが **tail であり *tail ではない理由です。

最後に何かを追加するためにリンクされたリスト全体を反復処理するのを避けるために、ある種の末尾参照を保持します (O(n) ではなく O(1) 追加の場合)。Tail は特定のインスタンスに設定されている可能性がありますが、この特定の実装戦略には理由があります。代わりに次のフィールドをポイントすると、次のように簡単になります。

new_item->next = NULL;
*tail = new_item;
tail = &(new_item->next);

お役に立てれば。

于 2012-11-30T10:34:55.180 に答える