C ++ вектор указателя на объект - max_size () - PullRequest
4 голосов
/ 24 октября 2011

у меня класс яблок

class apples
{
  private:
      double x;
      double y;
      double z;
  public:
      //some methods
};

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

int _tmain(int argc, _TCHAR* argv[])
{
vector<apples *> myvector;
cout<<"max :"<<myvector.max_size();
return 0;
}

это дало мне:

1073741823

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

так что, если есть 2 вектора

vector<int> A
& 
vector<double> B

может ли A иметь 1073741823 элемента, а B также иметь 1073741823 элемента? я прошу это уточнить, Максимальное количество элементов, которое может хранить вектор, не зависит от типа хранимой сущности (int или double)? (это не имеет никакого отношения к текущей емкости вектора!) Кроме того, каков будет размер указателя на объект яблок (не спрашивая размер объекта яблок!)? Спасибо.

Ответы [ 6 ]

7 голосов
/ 24 октября 2011

Это ограничение библиотеки для хранения элементов в векторе.

vector::max_size():

Возвращает максимальное количество элементов, которое может вектор-контейнер держать.

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

Таким образом, вы не можете хранить больше, чем это ( и на практике может быть меньше, чем это из-за системных ограничений)

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

И в соответствии с комментарием к max_size() в заголовочном файле: возвращает размер максимально возможного вектора%.

4 голосов
/ 24 октября 2011

max_size возвращает верхнюю границу количества элементов, которое может содержать вектор. Это не значит, что v.resize(v.max_size()) будет успешным. Это просто означает, что v.resize(v.max_size() + 1) потерпит неудачу.

2 голосов
/ 24 октября 2011

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

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

Текущий объем можно узнать, позвонив по номеру vector::capacity(), и, если вы хотите найтиузнайте, как далеко вы можете растянуть вектор в текущей настройке, затем продолжайте изменять размер вектора, пока не будет выдано исключение bad_alloc)

2 голосов
/ 24 октября 2011

Кроме того, каков будет размер указателя на объект яблок (не спрашивая размер объекта яблок!)?

Я уверен, что какой-нибудь адвокат по языку придет иотметим, что это не правильно, но на практике: 32-битные сборки будут использовать 32-битные указатели, поэтому указатель на объект составляет четыре байта.В 64-битных сборках вы получаете восемь байтов на указатель.

1 голос
/ 24 октября 2011

Могу ли я действительно хранить 1073741823 указателей в этом векторе или это объем памяти вектора?

max_size() говорит вам, что эта реализация vector не может обрабатывать размер больше этого;возможны векторы до этого размера, , если достаточно памяти для их хранения.

зависит от того, какое максимальное количество объектов может храниться в векторе, зависит от типа объекта?если да, как рассчитать это?

Это зависит от реализации vector и используемого им распределителя.На практике это обычно будет;вы, вероятно, обнаружите, что он равен чему-то вроде numeric_limits<size_t>::max() / sizeof (value_type);максимальное количество байтов, которое может быть выделено в массиве, деленное на размер объекта.

Кроме того, каков будет размер указателя на объект яблок (не спрашивая размер объекта яблок!)?

Это зависит от вашей платформы.Поскольку max_size() настолько мал, я предполагаю, что вы используете 32-битную платформу, и в этом случае указатель будет 32 бит (4 байта).Другие платформы будут иметь разные размеры указателя.

0 голосов
/ 24 октября 2011

hex (1073741823) = '0x3fffffff'

Так что это похоже на некоторый предопределенный предел.

...