что не так с настраиваемым распределителем в C++?

Бьерн Страуструп в своей книге «Язык программирования C++» говорит, что:

Совет: дважды подумайте, прежде чем писать собственный распределитель

Что хочет сказать Бьерн, давая приведенный выше совет? Какие проблемы могут возникнуть, если я напишу свой собственный распределитель? Это действительно проблематично? Как мне преодолеть проблемы?


person Destructor    schedule 21.06.2015    source источник
comment
@Кто проголосовал за закрытие? Почему? Что не так в вопросе?   -  person Destructor    schedule 21.06.2015
comment
просто чтобы уточнить, это книга Страуструпа, которая была опубликована в 1997 году, верно? Другие читатели могут ознакомиться с последней версией Страуструпа — четвертым изданием.   -  person Alejandro    schedule 21.06.2015
comment
@Alejandro: у меня третье издание.   -  person Destructor    schedule 21.06.2015
comment
распределитель — это общий термин: какой контекст он имеет в виду?   -  person edmz    schedule 21.06.2015
comment
Полезно прочитать: yosefk.com/blog/why-custom-allocatorspools- are-hard.html   -  person Rahul Tripathi    schedule 21.06.2015
comment
Подумайте дважды, прежде чем писать свой собственный распределитель, потому что 1) с вероятностью 99,99% вам не нужно его писать. 2) Его сложно написать и поддерживать (например, потокобезопасность и т.д.).   -  person 101010    schedule 21.06.2015
comment
Я думаю, этот совет не падает с неба? Если это так, я бы посоветовал прочитать аргументы, на которых он основан... то есть, как правило, на двух предыдущих страницах.   -  person davidhigh    schedule 21.06.2015


Ответы (1)


Вместе с двумя коллегами, Беном Зорном и Кэтрин МакКинли (оба сейчас в Microsoft Research), я написал об этом статью (Пересмотр пользовательского распределения памяти, OOPSLA 2002). Он получил награду Самая влиятельная статья — вот цитата.

Пользовательское управление памятью часто используется в системном программном обеспечении с целью снижения стоимости выделения и жесткого контроля объема памяти программного обеспечения. До 2002 года считалось само собой разумеющимся, что распределители памяти для конкретных приложений превосходят библиотеки общего назначения. Статья Бергера, Цорна и МакКинли посредством тщательного эмпирического исследования продемонстрировала, что это предположение недостаточно обосновано, и дала представление о причинах, по которым распределители общего назначения могут превзойти созданные вручную распределители. Статья также выделяется качеством своей эмпирической методологии.

Оригинальная статья на самом деле сделала несколько больше, чем цитата: вот выдержка из статьи. Распределитель Lea, о котором идет речь, составляет основу распределителя Linux.

Программисты, надеющиеся добиться повышения производительности, часто используют специальные распределители памяти. В этом подробном исследовании рассматриваются восемь приложений, использующих настраиваемые распределители. Удивительно, но для шести из этих приложений современный распределитель общего назначения (распределитель Lea) работает так же или даже лучше, чем пользовательские распределители. Два исключения используют регионы, которые обеспечивают более высокую производительность (улучшение до 44%). Регионы также снижают нагрузку на программиста и устраняют источник утечек памяти. Однако мы показываем, что неспособность программистов освобождать отдельные объекты внутри регионов может привести к существенному увеличению потребления памяти. Хуже того, это ограничение исключает использование регионов для общих идиом программирования, снижая их полезность.

Мы представляем обобщение аллокаторов общего назначения и региональных, которые мы называем reaps. Reaps — это комбинация регионов и куч, предоставляющая полный спектр семантики регионов с добавлением удаления отдельных объектов. Мы показываем, что наша реализация reaps обеспечивает высокую производительность, превосходя другие аллокаторы с региональной семантикой. Затем мы используем тематическое исследование, чтобы продемонстрировать на практике преимущества пространства и программной инженерии Reaps. Наши результаты показывают, что программистам, которым нужны быстрые регионы, следует использовать рипы, а большинству программистов, рассматривающих возможность создания пользовательских аллокаторов, следует вместо этого использовать аллокатор Lea.

Недавно мы провели дополнительное исследование и обнаружили почти такой же эффект в нескольких современных приложениях: пользовательские аллокаторы обычно замедляют работу приложения.

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

person EmeryBerger    schedule 21.06.2015