В sys/queue.h определена структура данных TAILQ. Он очень широко используется в ядре Linux. Его определение выглядит так:Задумываясь о цели tqe_prev TAILQ, не указывая на предыдущий узел
#define TAILQ_ENTRY(type) \
struct { \
struct type *tqe_next; /* next element */ \
struct type **tqe_prev; /* address of previous next element */ \
}
Я немного озадачен в этом коде: что преимущество иметь tqe_prev указывая tqe_next предыдущего узла? Если бы это был я, я бы имел tqe_prev, непосредственно указывающий на предыдущий узел, похожий на tqe_next, указывающий на следующий узел.
Одна из причин, по которой я буду думать, когда мы вставляем узел, мы непосредственно работаем над обновляемым указателем, нам не нужно сначала проходить через его собственный узел. Но так ли это? Любые другие преимущества?
Мне интересно, как мы можем путешествовать в обратном направлении от очереди? Когда у нас есть указатель на узел, поскольку его tqe_prev не указывает на предыдущий узел, мы не можем пройти очередь до головы. Или такое отсталое путешествие по дизайну не поддерживается TAILQ?
Только автор наверняка знал бы, но это разумное предположение, что это повышение производительности (исключить дополнительный уровень косвенности для обновления предыдущего). Что касается вашего второго пункта, очереди часто кругообразны, поэтому нет необходимости уходить назад. –