Как узнать правильный максимальный размер вектора? max_size ()? но нет - PullRequest
2 голосов
/ 26 марта 2012

При использовании вектора отображается «Недостаточно памяти».
Чтобы исправить это, я использую max_size () для проверки, затем резервирую или push_back.
Если max_size () больше зарезервированного значения, оно должно быть в порядке, но это не так! Тогда что означает max_size ()?
Я компилирую ниже демо в Windows 7 и Visual Studio 2010. Мой компьютер имеет 4 ГБ оперативной памяти. Когда повторное обращение равно 1/2 от max_size (), оно завершается неудачно.

max_size()=2^32/sizeof(CPoint3D)-1=268435455

Это нормально, когда 1/4 max_size () в демоверсии. В моем реальном проекте все нормально до 1/10.

Какое значение имеет максимальный размер вектора, как его увеличить ?


Я получил ошибку «недостаточно памяти», когда я вставил много элементов в std::vector. Чтобы избежать ошибки, я сначала проверил с помощью vector::max_size(), а для предварительного выделения памяти использовал vector::reserve(). Тем не менее, это не работает. В демонстрационном проекте ошибка возникает, когда я резервирую 1/4 от max_size. В реальном проекте ошибка возникает, когда я резервирую 1/10 его. Я использую Windows 7 и компилирую с Visual Studio 2010. Мой компьютер имеет 4 ГБ ОЗУ.

Если max_size не работает, как узнать максимальное количество элементов, которое я могу выделить для vector?

Ответы [ 4 ]

4 голосов
/ 26 марта 2012

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

Это не означает, что вы действительно можете удерживать векторчто много элементов.Это просто означает, что вы никогда не сможете хранить больше.Кроме того, только то, что у вас есть 4 гигабайта оперативной памяти, не означает, что вы действительно можете создать один непрерывный буфер, который занимает 4 гигабайта оперативной памяти или где-либо еще.Есть и другие факторы, которые следует учитывать, например фрагментацию памяти (из-за этого вы можете вставить только один гигабайтный блок памяти в физическую память.)вероятно, не очень хороший выбор.Для таких больших наборов данных вам может понадобиться что-то, что можно разбить на куски и кусочки, например std :: deque.

4 голосов
/ 26 марта 2012

max_size() говорит о пределе дизайна класса, но нехватка памяти может ограничить реальный размер до чего-то меньшего.Как правило, нет никакого способа узнать, каким может быть нижний предел (например, он может меняться от одного момента к другому в зависимости от того, сколько памяти используется другими программами).

3 голосов
/ 26 марта 2012

vector::capacity() дает максимальное количество элементов, которые могут быть сохранены в векторе без перераспределения, которое может потенциально потерпеть неудачу из std::bad_alloc.

vector::max_size() имеет другое значение, примерно похожее на (INT_MAX / sizeof(element)).

Подробнее об управлении памятью в Windows см. В статье MSDN

2 голосов
/ 26 марта 2012

Проблема в том, что vector пытается выделить непрерывный блок памяти, который может быть недоступен в то время, даже если общий объем доступной памяти может быть намного больше.

Я бы предложил использовать std::deque, поскольку для этого не требуется выделять непрерывный блок памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...