со всем, как он разработан из коробки, нет, это невозможно. У вас есть несколько вариантов для этого, хотя и по-своему.
Если вам это нужно исключительно для стандартных контейнеров, вы можете реализовать аллокатор, который отслеживает объем памяти, были выделена (и не освобожденная) с помощью этого распределителя.
Если вы хотите использовать эту возможность для всего, что выделено через new
(будь то контейнер или нет), вы можете предоставить свою собственную реализацию operator new
по глобальной и/или классовой основе и иметь (например) построить неупорядоченный карту от указателей до размеров блоков, чтобы указать размер любого выделенного блока (и с этим вам нужно будет предоставить функцию для извлечения этого размера). В зависимости от платформы это также может быть реализовано с использованием функций, специфичных для платформы. Например, когда вы создаете компилятор Microsoft (ну, на самом деле, библиотека), ваша реализация operator new
не должна была бы ничего делать вообще, и функция для получения размера блока выглядела бы примерно так:
size_t block_size(void const *block) {
return _msize(block);
}
Еще одна возможность будет увеличивать размер распределения каждого запрашиваемого блока размером в целое число, достаточно большой, чтобы держать размер. В этом случае вы выделили бы больший фрагмент данных, чем запрошенный пользователем, и сохраните размер этого блока в начале возвращаемого блока. Когда пользователь запрашивает размер блока, вы берете правильное (отрицательное) смещение от указателя, которое они передают, и возвращают значение, которое вы там храните.
В общем случае, только для конкретных платформ. Он очень привязан к реализации кучи. –
Кому следует использовать значение shared_ptr <>? – lorro
'std :: cout << sizeof (int) * v.capacity() << endl;' – GreatAndPowerfulOz