Как передать пользовательский распределитель в std :: string в C ++? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть std::shared_ptr<std::string>, и я хотел бы измерить динамическую c память, выделенную им во время выполнения.
Проще говоря, я хочу знать:

  1. размер std::shared_ptr<std::string>. control_block
  2. часть, которая не подходит для оптимизации небольших строк для std::string

Я написал пустышку распределитель, который просто регистрирует объем требуемой оперативной памяти и намеревается использовать ее в обоих случаях ( мой пример кода ). Для случая 1 я просто передал свой пользовательский распределитель в качестве аргумента std::allocate_shared. и все работает, из примера вывода я вижу 48 байтов, используемых для создания control block, среди тех 32 используется для хранения string и остальных 16 , вероятно, разделен между ref_count и pointer to my custom allocator

Проблема возникает, когда я пытаюсь передать пользовательский распределитель на std::string, глядя на определение std::basic_string, это имеет много конструкторов с параметром allocator, однако ... Я, насколько я знаю, реализация string обычно не содержит указатель на распределитель, поэтому я не знаю, что эти функции могут делать? enter image description here

std::allocate_shared<std::string>(customStringAlloc,"confusedDev", customCharAlloc) будет собираться, но моя собственная версия allocate() никогда не вызывалась ... Мне удалось заставить ее работать, определив новый тип basic_string<char,char_traits<char>,CustomAllocator<char>>. Но мне нужно решение, которое возвращает std::shared_prt<std::string> ... другой тип не обрежет его

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