Как заставить библиотеку использовать пользовательский std :: allocator? - PullRequest
1 голос
/ 18 сентября 2011

Я использую SFML, который обрабатывает большую часть своей памяти через std::vector<Uint32> и другие типы, подобные этому. Все объявления используют Allocator по умолчанию. Библиотека SFML скомпилирована в файлы .lib, которые статически связаны в Visual Studio. (У меня есть весь исходный код, однако, если это необходимо.)

Мой вопрос заключается в том, какой наименее болезненный метод заставить SFML использовать мой собственный распределитель малых объектов / потокобезопасный для контейнеров STL вместо стандартного? Чем меньше мне нужно менять саму библиотеку, тем лучше, конечно!

Редактировать

Если это вообще поможет, забудьте о реализации библиотеки; Я могу перекомпилировать это по своей прихоти. Ради вопроса, представьте, что я использую мой код. Моя цель - изменить Allocator по умолчанию, который, по сути, используют все контейнеры STL.

Edit2

Если это вообще невозможно, будет ли переопределение new само по себе правильным методом? Я читал, что распределитель по умолчанию - это не более, чем сахарное покрытие операций new / delete.

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Что ж, самый «грубый» или надежный метод может создать библиотеку с предзагрузкой, которая реализует malloc / free (и друзья?)

Обычно так работают отладчики кучи / контролеры границ.

Однако я ничего не знаю о требованиях распределителя SFML, поэтому он может не работать, если пространство очень ограничено. В этом случае я предлагаю «маршалинг» (причудливое слово для копирования) данных в выделенные пользователем области при необходимости

Тангенциально связанный:

Eletronics Art имеет «порт» STL для разработки игр. Он в значительной степени приспособлен для пользовательских распределителей (фактически, он не поставляется по умолчанию!). Вы можете взглянуть на

0 голосов
/ 26 июня 2013

Чтобы изменить новый оператор по умолчанию, просто реализуйте эти функции (в глобальном масштабе):

void* operator new (std::size_t size) throw (std::bad_alloc);

Вы можете найти там больше информации: http://www.cplusplus.com/reference/new/operator%20new/

Я не совсем уверенбудет работать с динамическими библиотеками.

...