Как узнать размер std::vector
std::vector<std::vector<std::vector<double>>> * N;
N = new std::vector<std::vector<std::vector<double>>>;
Происходит несколько resize(), вектор разрастается.
Как узнать сколько памяти вектор занимает в данный момент, включая свои данные? Вызывать рекурсивно для его подвекторов size, перемножать - не совсем приятно :)
delete N;
Не получится.
Советую изучить что такое sizeof.
Да, именно так.
Либо хранить значение и изменять его при изменении размера векторов.
Советую изучить что такое sizeof.
Вообще-то да. Затупил. Извиняюсь.
std::vector<std::vector<std::vector<double>>> * N;
N = new std::vector<std::vector<std::vector<double>>>;
Происходит несколько resize(), вектор разрастается.
Как узнать сколько памяти вектор занимает в данный момент, включая свои данные? Вызывать рекурсивно для его подвекторов size, перемножать - не совсем приятно :)
Есть сомнения, что так можно узнать сколько памяти вектор занимает. Разве, что с определенным допуском. То есть, вектор не обязательно занимает столько памяти, сколько занимают хранимые им полезные данные.
Приведу пример:
{
vector< vector<int> > m;
m.push_back(vector<int>());
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
int *p0 = &m.front().front();
int *p1 = &m.back().back();
cout << abs((int)p0 - (int)p1) + sizeof(int) << endl;
cout << m[0].capacity() << endl;
return 0;
}
Тут у меня эта программа выводит 24 (как и ожидалось) и 8 (как не ожидалось).
Далее
{
vector< vector<int> > m;
m.push_back(vector<int>());
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
m[0].push_back(10);
m.push_back(vector<int>());
m[1].push_back(10);
m[1].push_back(10);
m[1].push_back(10);
m[1].push_back(10);
m[1].push_back(10);
int *p0 = &m.front().front();
int *p1 = &m.back().back();
cout << abs((int)p0 - (int)p1) + sizeof(int) << endl;
cout << m[0].capacity() << endl;
cout << m[1].capacity() << endl;
return 0;
}
Выводит 60, 6, 8...
Можно придраться к наглой работе с указателями, но почему же capacity() выдает такие числа? Наверное вектор резервирует дополнительную память.
capacity, в отличие size, возвращает количество элементов, которые вектор может хранить без выделения дополнительной памяти. Вектор действительно выделяет заранее некоторый объем памяти для хранения элементов, при заполнении этой памяти выделяется новый участок.
И я про то же. То есть точнее будет складывать capacity.
Однако, не уверен, что и в этом случае будет известно, сколько точно памяти занимает вектор, так как при его реализации могли быть зарезервированы какие-то дополнительные ячейки памяти, например, для хранения значений size и capasity и т.п. Хотя, наверно, этими данными можно принебречь.
Если вам интересно еще и сколько весит сам объект(класс) vector, то вот здесь уже подойдет sizeof.
то есть, решая в лоб (без рекурсий и т.п) результат, близкий к точному можно получить так:
//...
// полагая, что для любого пустого вектора размер един
const size_t szvector = sizeof(vector<double>);
size_t count = szvector * (1 + n.capacity()); // память на главный вектор и его подвекторы
for (size_t i = 0; i < n.size(); ++i)
{
count += n.capacity() * szvector; // память на пустые подподвектора
for(size_t j = 0; j < n.size(); ++j)
{
count += n[j].capacity() * sizeof(double); // память на данные и резерв для данных
}
}
cout << count << endl;
ИМХО никакого практического применения.
Если это диктуется ограничениями памяти, то тут скорее критичнее фрагментация, а не размер. И в таких случаях отходят от использования стандартных контейнеров к специализированным (самописным).
Если с т.з. сериализации, то здесь собственный размер не при чем, т.к. сериализуются данные.
Отсюда делаю вывод, что автору нужен суммарный размер данных.
С практической т.з. может и нет пользы, но мне стало интересно с научной :) Хотя, конечно, тут лучше начать с теории как реализуются векторы.
В стандарте нет конкретных описаний, как должен реализовываться вектор. Есть описание интерфейса, замечания по формату хранения данных (данные вектора должны храниться как непрерывный блок памяти) и замечания об особенностях вектора bool.
Так что реализован вектор может быть как угодно в соотв. со стандартом.