Используемые средства платформы позволяют выделять память с некоторым тегом - четырехсимвольной константой - для дальнейшего удобства отладки.
С++ обёртка в виде шаблона аллокатора должна уметь использовать эти теги. Однако должен ли тег быть частью типа - или всё-таки состояния?
а есть ли смысл платить за то, чтобы тег был частью состояния?
Аргументы jxy-s за параметр шаблона: 1. Теги вряд ли будут меняться в рантайме 2. Отсутствует риск "растекания" аллокаций с конкретным тегом по коду - чётко прослеживается связь "codepath-tag" Мои аргументы за состояние: 1. Избавление от копирований контейнеров на границе тегов (и поддержка move-only сущностей) 2. Совместимость с тегонезависимым кодом (например, использующим дефолтный operator-new-based аллокатор)
про ваш первый аргумент: а у выделенной памяти можно поменять тег после ее выделения?
сделай тег отдельно и аллокатор использующий глобальную переменную =)
получается, что копировать все равно придется, чтобы данные лежали в памяти с правильным тегом?
Вредные советы?)
Смотря что считать "правильным" - термин "граница тегов" весьма тонкий. Можно смувать, например, вектор целиком - и данные, и аллокатор (сам по себе он trivially copyable). Считается, что условием эквивалентности аллокаторов всегда является равенство тегов.
Фактически - мой первый аргумент vs. второй аргумент jxy-s
а почему это будет не тегонезависимым кодом, если сделать аллокатор-обертку над std::alocator, приводящийся к нему?)
перемещать данные ок, но не аллокатор с тегом, насколько я себе представляю всю эту конструкцию. потому что тег перемещенного аллокатора не будет совпадать с тегом памяти, в которую данные перемещаются
Я бы сказал, что это дело вкуса. Лично я бы предпочел тэг в состоянии, потому что работал с тэгами аллокаторов на уровне типов - это много гемороя.
Так перемещение вектора подразумевает "кражу" буфера у исходного объекта, а не поэлементное перетаскивание содержимого в другую память :)
а, точно тогда есть смысл хранить тег как часть состояния
Это может дать не очевидный результат: память выделенная через вектор перешедший границу модуля будет тэгаться старым тэгом. По-хорошему, наверное, тэгированные аллокации должны покидать модуль только в виде константных ссылок, чтобы такого не происходило.
Плюс отключить пропагацию аллокаторов при копировании.
С этим соглашусь - иначе точно получим нежелательную утечку тэгов
Обсуждают сегодня