2

list_empty()関数はで定義され./include/linux/list.h、その定義は

static inline int list_empty(const struct list_head *head)
{
    return head->next == head;
}

list_headデータ構造は次のように定義されます

struct list_head {
     struct list_head *next, *prev;
};

私が理解していないのは、カーネルでのこの実装が&&head->next == headではなくチェックする理由です。head->next == NULLhead->prev == NULL

4

2 に答える 2

9

リストは循環型で、ヘッド自体がダミーノードとして機能します。循環リストには、挿入および削除中に必要な比較の数にわずかな利点があります。nullポインターがないため、探すべき特別なケースはそれほど多くありません。ここにソースコードはありませんが、チェックすると、リストの初期化は次のように行われていることがわかります。

head->next = head->prev = head;

挿入は次のようになります。

void insert_after(struct list_head *node, struct list_head *after)
{
  node->next = after->next;
  node->prev = after;
  after->next->prev = node;
  after->next = node; 
}

見て!いいえifステートメントはまったくありません!

于 2012-10-25T17:41:57.177 に答える
0

リストが空のときでhead->nextはないため、代わりにポイントします。NULLhead

于 2012-10-25T17:43:16.460 に答える