Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать размер std::vector

9.7K
29 июля 2008 года
Reskator
26 / / 07.02.2007
Есть указатель на вектор:

std::vector<std::vector<std::vector<double>>> * N;
N = new std::vector<std::vector<std::vector<double>>>;

Происходит несколько resize(), вектор разрастается.
Как узнать сколько памяти вектор занимает в данный момент, включая свои данные? Вызывать рекурсивно для его подвекторов size, перемножать - не совсем приятно :)

delete N;
288
29 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Попробуйте sizeof(*N)
3
29 июля 2008 года
Green
4.8K / / 20.01.2000
Цитата: nikitozz
Попробуйте sizeof(*N)


Не получится.
Советую изучить что такое sizeof.

3
29 июля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Reskator
Вызывать рекурсивно для его подвекторов size, перемножать - не совсем приятно :)


Да, именно так.
Либо хранить значение и изменять его при изменении размера векторов.

288
29 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Green
Не получится.
Советую изучить что такое sizeof.



Вообще-то да. Затупил. Извиняюсь.

87
31 июля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Reskator
Есть указатель на вектор:

std::vector<std::vector<std::vector<double>>> * N;
N = new std::vector<std::vector<std::vector<double>>>;

Происходит несколько resize(), вектор разрастается.
Как узнать сколько памяти вектор занимает в данный момент, включая свои данные? Вызывать рекурсивно для его подвекторов size, перемножать - не совсем приятно :)



Есть сомнения, что так можно узнать сколько памяти вектор занимает. Разве, что с определенным допуском. То есть, вектор не обязательно занимает столько памяти, сколько занимают хранимые им полезные данные.

Приведу пример:

Код:
int main()
{
    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 (как не ожидалось).
Далее
Код:
int main()
{
    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() выдает такие числа? Наверное вектор резервирует дополнительную память.
288
01 августа 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Kogrom
но почему же capacity() выдает такие числа? Наверное вектор резервирует дополнительную память.


capacity, в отличие size, возвращает количество элементов, которые вектор может хранить без выделения дополнительной памяти. Вектор действительно выделяет заранее некоторый объем памяти для хранения элементов, при заполнении этой памяти выделяется новый участок.

87
01 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: nikitozz
capacity, в отличие size, возвращает количество элементов, которые вектор может хранить без выделения дополнительной памяти. Вектор действительно выделяет заранее некоторый объем памяти для хранения элементов, при заполнении этой памяти выделяется новый участок.



И я про то же. То есть точнее будет складывать capacity.

Однако, не уверен, что и в этом случае будет известно, сколько точно памяти занимает вектор, так как при его реализации могли быть зарезервированы какие-то дополнительные ячейки памяти, например, для хранения значений size и capasity и т.п. Хотя, наверно, этими данными можно принебречь.

288
01 августа 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Kogrom
Однако, не уверен, что и в этом случае будет известно, сколько точно памяти занимает вектор, так как при его реализации могли быть зарезервированы какие-то дополнительные ячейки памяти, например, для хранения значений size и capasity и т.п. Хотя, наверно, этими данными можно принебречь.



Если вам интересно еще и сколько весит сам объект(класс) vector, то вот здесь уже подойдет sizeof.

87
01 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: nikitozz
Если вам интересно еще и сколько весит сам объект(класс) vector, то вот здесь уже подойдет sizeof.



то есть, решая в лоб (без рекурсий и т.п) результат, близкий к точному можно получить так:

Код:
vector<vector<vector<double> > > n;
//...

    // полагая, что для любого пустого вектора размер един
    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;
3
01 августа 2008 года
Green
4.8K / / 20.01.2000
Уважаемые, а вы задумывались, зачем с практической т.з. нужно определять раз мер занимаемой вектором памяти?
ИМХО никакого практического применения.

Если это диктуется ограничениями памяти, то тут скорее критичнее фрагментация, а не размер. И в таких случаях отходят от использования стандартных контейнеров к специализированным (самописным).
Если с т.з. сериализации, то здесь собственный размер не при чем, т.к. сериализуются данные.

Отсюда делаю вывод, что автору нужен суммарный размер данных.
87
03 августа 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Уважаемые, а вы задумывались, зачем с практической т.з. нужно определять раз мер занимаемой вектором памяти?


С практической т.з. может и нет пользы, но мне стало интересно с научной :) Хотя, конечно, тут лучше начать с теории как реализуются векторы.

3
03 августа 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
Хотя, конечно, тут лучше начать с теории как реализуются векторы.


В стандарте нет конкретных описаний, как должен реализовываться вектор. Есть описание интерфейса, замечания по формату хранения данных (данные вектора должны храниться как непрерывный блок памяти) и замечания об особенностях вектора bool.

Так что реализован вектор может быть как угодно в соотв. со стандартом.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог