Некоторая проблема об инициализации вектора - PullRequest
0 голосов
/ 01 марта 2019

Я могу инициализировать вектор с 10 ^ 8, но я не могу инициализировать его с 10 ^ 9. Почему?

 vector<int> bucket;
 bucket.resize(100000000);      √ 
 bucket.resize(1000000000);     ×

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Это потому, что функция resize будет применять память из кучи.Как вы можете догадаться, размер вашей второй операции изменения размера будет 4000000000 байт, что больше, чем пространство, которое может выделить ваша система (возможно, ваш компьютер не может найти фрагмент непрерывного пространства для вас), и вызовет исключениеи сбой.

Максимальный объем памяти, к которому вы можете обратиться, зависит от многих следующих причин:

  1. аппаратное ограничение физической памяти.
  2. бит os (32или 64)
  3. память оставлена ​​для пользователя.Операционная система должна удовлетворять потребности ядра в первую очередь.Вообще говоря, ядру Windows требуется больше памяти, чем Linux или Unix.
  4. ..

Одним словом, точный объем памяти, который вы можете использовать, трудно определить, потому что он динамическийзначение.Но вы можете сделать приблизительную оценку по новому оператору , , и вот хороший пример.

0 голосов
/ 01 марта 2019

Векторы C ++ выделяют память в непрерывном блоке, и вполне вероятно, что операционная система не может найти такой блок, когда размер блока становится слишком большим.

Если полученное сообщение об ошибке указывает на то, что вы работаетеНедостаточно памяти?

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

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