2016-06-29 2 views
-1

Я понимаю, что мы можем использовать size() функцию, чтобы получить вектор размера, например:Как узнать размер выделенной памяти std :: vector?

std::vector<in> abc; 
    abc.resize(3); 
    abc.size(); 

мой вопрос, как я могу узнать размер памяти вектора? Возьмем пример:

std::vector<int> abc; 
abc.reserve(7); 
//the size of memory that has been allocated for abc 
+0

http://en.cppreference.com/w/cpp/container/vector – juanchopanza

ответ

3

Вы можете использовать функцию-член capacity(), чтобы получить выделенную емкость

std::vector<int> abc; 
abc.reserve(7); 
std::cout << abc.capacity() << std::endl; 

Чтобы получить память, выделенную в байтах, вы можете сделать:

sizeof(int) * abc.capacity(); 

Этот , что вы знаете, что ваш value_type - int. Если вы не

sizeof(decltype(abc.back())) * abc.capacity(); 
+2

Обратите внимание, что размер, возвращаемый 'capazcity' (и' size'), находится в количестве элементов, а не в байтах, если память , – user2079303

+1

или, в более общем смысле, 'sizeof (decltype (abc.front()) * abc.capacity)' – Curious

+0

Имеет ли размер объекта дополнение? – mksteve

0

Есть сильные заявления о памяти являются смежными, и поэтому размер

sizeof(abc[0]) * abc.capacity(); 

или

( (char*)(&abc[1]) - (char*)(&abc[0])) * abc.capacity(); 
+0

Зачем предлагать второй метод? Это сложнее, не дает преимущества для первого, и я думаю, что это технически UB, если массив не содержит по крайней мере 2 элемента. Первое приятно. – user2079303

+0

Вы не можете зависеть от sizeof (abc [0]) == sizeof (T). Оператор [] может возвращать прокси-объект. Вам будет лучше с 'value_type'. –

+1

@CrazyEddie: В случае, о котором вы, вероятно, думаете, 'vector ', вы не можете рассчитывать на 'sizeof (value_type) * capacity()', являющийся также фактическим объемом выделенной памяти. –

0

Поскольку std :: vector может хранить сложные объекты (например, std :: stri ng), которые имеют внутреннее управление памятью и могут выделять дополнительную память, определение общего использования памяти может быть затруднено.

Для вектора, содержащего простые объекты, такие как INT, предложенное решение с использованием потенциала и SizeOf будет работать, хотя.

1

Настоящий ответ заключается в том, что вы не можете. Другие предложили способы, которые часто будут работать, но вы не можете зависеть от capacity, отражающих каким-либо образом выделенную память.

С одной стороны, куча часто выделяет больше памяти, чем было запрошено. Это связано с оптимизацией против фрагментации и т. Д. vector не имеет способа узнать, сколько памяти было выделено, только то, что она запросила.

Так что capacity в лучшем случае дает приблизительную оценку.

Смежные вопросы