Направление от func () к __func () - PullRequest
       17

Направление от func () к __func ()

1 голос
/ 07 августа 2009

Цитирование фрагмента кода:

/**
 * list_add - add a new entry

 * @new: new entry to be added
 * @head: list head to add it after
 *
 * Insert a new entry after the specified head.
 * This is good for implementing stacks.
 */

static inline void list_add(struct list_head *new, struct list_head *head)
{
    __list_add(new, head, head->next);
}

Я видел похожий код в нескольких разных программах, особенно в тех, которые манипулируют структурами данных. Каково обычное намерение при добавлении этого дополнительного уровня косвенности - почему код внутри __list_add нельзя поместить в list_add?

Ответы [ 8 ]

3 голосов
/ 07 августа 2009

Если вы скопируете код, это усложнит обслуживание. В этом примере дополнительный уровень косвенности скрывает параметр next. Это обеспечит функцию только с 2 параметрами вместо 3.

Если код внутри __list_add () скопирован, его необходимо скопировать в несколько мест. Если затем механизм списков будет несколько изменен, все эти места также должны быть обновлены, или ошибки начнут появляться (т.е. реализация списка в FIFO и LIFO показывает различное поведение).

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

2 голосов
/ 07 августа 2009

Речь идет о повторном использовании кода и избежании дублирования.

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

Совместное использование кода имеет несколько преимуществ:

  • Если в __list_add() есть ошибка, и вы ее исправляете, все функции, которые ее используют, исправляют ее.
  • Если __list_add() получает улучшение (например, вы делаете это быстрее), все функции становятся быстрее.
  • Есть только одно место для просмотра, когда вы хотите увидеть, как элементы добавляются в списки.
0 голосов
/ 07 августа 2009

Может также быть для двоичной совместимости. у вас есть косвенность, которая позволяет сохранить инвариант ABI.

С http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Когда новая версия библиотеки бинарно-несовместим со старым сонама должна измениться. В С, Есть четыре основные причины библиотека перестала бы быть бинарной совместимый:

  1. Поведение функции изменяется так, что она больше не соответствует оригинальная спецификация,
  2. Изменение экспортируемых элементов данных (исключение: добавление дополнительных элементов в Концы структур в порядке, так как Пока эти структуры только выделяется в библиотеке).
  3. Экспортированная функция удалена.
  4. Изменен интерфейс экспортируемой функции.
0 голосов
/ 07 августа 2009

Также обычно определяют функцию-обертку для рекурсивных функций, чтобы начальные параметры были установлены правильно.

См. Бинарный поиск в Википедии для Рекурсия (информатика)

0 голосов
/ 07 августа 2009

Эта функция взята из ядра Linux. Это относится к реализации общего списка:

Взгляните: __list_add()

__list_add() используется во многих местах: например, list_add(), который добавляет элемент в начало списка, list_add_tail(), который добавляет элемент в конец списка ... Он также может использоваться для вставки элемента в заданную позицию.

0 голосов
/ 07 августа 2009

Эта оболочка inline. Если вы добавите тело __List_add, оно тоже будет встроено. Основная цель состоит в том, чтобы просто вставить нажатие дополнительного аргумента head->next и ничего больше.

0 голосов
/ 07 августа 2009

__ list_add будет предназначен как «частная» внутренняя функция, которая может иметь многократное внутреннее использование. Общедоступный список list_add находится как удобная оболочка вокруг него.

0 голосов
/ 07 августа 2009

Может.

Однако, возможно, есть другие публичные записи, которые могут поделиться кодом в __list_add(). например, может быть push() или insert_head() или что-то в этом роде.

ПРИМЕЧАНИЕ. Если это C ++, вы можете переосмыслить вызов ваших переменных new, поскольку это зарезервированное слово.

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