У меня есть std::shared_ptr<std::string>
, и я хотел бы измерить динамическую c память, выделенную им во время выполнения.
Проще говоря, я хочу знать:
- размер
std::shared_ptr<std::string>
. control_block
- часть, которая не подходит для оптимизации небольших строк для
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
обычно не содержит указатель на распределитель, поэтому я не знаю, что эти функции могут делать?
std::allocate_shared<std::string>(customStringAlloc,"confusedDev", customCharAlloc)
будет собираться, но моя собственная версия allocate()
никогда не вызывалась ... Мне удалось заставить ее работать, определив новый тип basic_string<char,char_traits<char>,CustomAllocator<char>>
. Но мне нужно решение, которое возвращает std::shared_prt<std::string>
... другой тип не обрежет его