В коде «хороший вкус» и «плохой вкус» отсутствует free ()? - PullRequest
3 голосов
/ 22 мая 2019

В интервью о Линусе Торвальдсе он рассказал о важности «хорошего вкуса».Хороший вкус он объяснил следующим кодом:

Код с "плохим вкусом"

remove_list_entry(entry)
{
    prev = NULL;
    walk = head;

    // Walk the list

    while (walk != entry) {
        prev = walk;
        walk = walk->next;
    }

    // Remove the entry by updating the head
    // or the previous entry

    if (!entry)
        head = entry->next;
    else
        prev-next = entry->next;
}

Код с "хорошим вкусом"

remove_list_entry(entry)
{
    // The "indirect" pointer points to the
    // *address* of the thing we'll update

    indirect = &head;

    // Walk the list, looking for the thing that
    // points to the thing we want to remove

    while ((*indirect) != entry)
        indirect = &(*indirect)->next;

    // .. and just remove it
    *indirect = entry->next;
}

Оба примера не имеютиспользуйте free() для освобождения памяти узла, подлежащего удалению.Может кто-нибудь сказать мне, почему код написан таким образом?Или у меня неправильное представление о C или связанном списке?

Ответы [ 2 ]

3 голосов
/ 22 мая 2019

Важно также отметить семантику этой функции.Он предназначен для удаления узла из списка, а не для удаления узла, как вы предлагаете в своем вопросе.По крайней мере, это подразумевается именем функции.Я был бы удивлен, если бы он удалил узел без объявления этой семантики.

Более того, у нас нет способа узнать в отдельности, как был выделен объект, поэтому функция не может разумно предположить, что это объект кучи и free()это - это вызвало бы ошибку во время выполнения, если бы объект был статическим.

Вызывающий объект может удалять объект из списка и продолжать его использовать, эта функция отвечает за поддержание списка , а не объектов в списке, которые существуют независимо.Ответственность за управление памятью принадлежит владельцу entry.

1 голос
/ 22 мая 2019

В этом контексте хороший вкус иллюстрируется минимализмом;второй пример менее витиеват и ближе к делу, чем первый.В коде плохого вкуса есть несколько ошибок, но дело в том, что дополнительная переменная и оператор if являются излишними.

Вкус - это субъективное качество, и есть много причин, чтобы поддержать любой подход.Для меня вкус всегда был о читабельности.Читаемость не дает четкого представления в пользу любого из этих подходов - TLDR против Too Complex;Не беспокоить (TC; DB).

Технология компилятора оказывает влияние моды на вкус.Давным-давно, когда речь шла об оптимизации подглядывания, предпочиталась вторая версия;он генерировал значительно меньше кода.В не очень давние времена компиляторы увлекались анализом потока данных и любили первую версию, потому что погоня за указателями была явно не скрытым псевдонимом (в отличие от второй).Современные компиляторы, так что хип с большими объемами памяти и процессором позволяют лучше проверять псевдонимы, поэтому вернулись к первому.Даже в вашем примере это 3 разные инструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...