Я написал расширение BIOS (в основном драйвер устройства для BIOS, написанный на сборке) для хост-контроллера USB. - Реализация высокоуровневой, казалось бы, абстрактной структуры данных, такой как связанный список в сборке, не так сложна, как кажется. - Контроллер обслуживал запросы ввода-вывода для клавиатуры и диска, используя связанный список пакетов в основной памяти. Я сохранил пул бесплатных пакетов в другом связанном списке. Выполнение операций ввода-вывода в основном включало захват свободного пакета из начала списка свободных номеров, настройку пакета, добавление пакета в список устройств и повторное добавление пакета в начало свободного пула после завершения ввода-вывода. Связанные списки молниеносно перемещаются вокруг таких объектов, особенно когда они большие, поскольку объекты на самом деле не должны двигаться. Только их указатели должны быть обновлены.
Для очереди на основе массива потребуется:
- с использованием указателя начала / конца индекса, который быстр, но требует фиксирования размера очереди, так что производитель должен ждать, когда очередь потребителя заполнится, и блокировать очередь, пока весь пакет заполнен, если их больше, чем один производитель
- смещение всех элементов в очереди всякий раз, когда вы вставляете / удаляете, что медленно для больших объектов
Таким образом, связанные списки являются хорошим способом реализации произвольно длинной очереди «первым пришел - первым вышел».
Еще одна вещь, о которой следует быть осторожным, заключается в том, что для небольших объектов или в тех случаях, когда вы выделяете объекты из обычной кучи вместо настраиваемого свободного пула, массивы могут быть быстрее, потому что копирование на самом деле не такое медленное, если оно выполняется не так часто, повторное выделение из кучи, которая потребуется связанному списку при каждом добавлении нового элемента, является медленным.
Конечно, вы можете смоделировать и измерить ваш конкретный сценарий с помощью некоторого одноразового тестового кода, чтобы найти ответ. Мне нравится запускать циклы несколько миллионов раз со связанными списками и массивами, с маленькими и большими объектами, и время, которое занимает каждый из них в реальном времени. Иногда вы будете удивлены.