Размер "вектора объектов" по сравнению с "вектором указателей объектов" - PullRequest
1 голос
/ 06 сентября 2011

Я пытаюсь понять, сколько памяти занято, используя вектор объектов по сравнению с вектором указателей.Я написал небольшой тестовый код:

class Test {
public: 
   Test()
   { v.resize(2000); }

private:
    std::vector<int> v;
};

int main() 
{
   std::vector<Test> OCtr;
   std::vector<Test*> PCtr;
   Octr.resize(10);
   PCtr.resize(10, new Test);
   cout << OCtr.size()*sizeof(Test) << endl;
   cout << PCtr.size()*sizeof(Test*) << endl; 
}

Вывод 120 и 40. Я могу понять 40 - это 10 * 4 байта, но удивлен 120. Является ли это реальным размером контейнера -OCtr?Похоже, sizeof (Test) - неправильный способ получить полный размер объекта.

  • Вместо предоставления функции-члена внутри класса Test для суммирования памяти всех членов данных Test, есть лидругой, чтобы получить размер любого объекта класса.
  • Я прочитал ответы о том, когда использовать вектор объектов в сравнении с вектором указателей объектов.Но в случае, когда я создаю контейнер простого класса (без полиморфного поведения), где потребление памяти является основным критерием, и я могу справиться с удалением указателей объектов, какой контейнер мне выбрать?

Ответы [ 4 ]

3 голосов
/ 06 сентября 2011

Если вы берете размер экземпляра вектора, он всегда будет одинаковым для конкретной реализации системы.В вашем случае это 12 байт.Векторы выделяют память с использованием стандартного или предоставленного распределителя для фактического хранения содержимого их объектов.Эта память по умолчанию из кучи и не записывается в размере самого векторного объекта.

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

2 голосов
/ 06 сентября 2011

sizeof - оператор времени компиляции.То есть sizeof(X) будет заменено во время компиляции на постоянное число.Это означает, что sizeof пустой vector<T> всегда совпадает с sizeof a vector<T> с тысячами элементов внутри него.Помните, что sizeof ничего не делает во время выполнения, поэтому результат не может отражать текущее состояние вектора.

1 голос
/ 06 сентября 2011

120 байт будет 12 байт на объект, где каждый объект просто хранит вектор, поэтому размер вектора и размер вашего класса одинаковы; если я сделаю предположение, я бы предположил, что int для размера, и int для емкости, и еще один указатель на данные, всего до 12. Это вполне понятно.

Помните, что векторы хранят свои данные в куче, поэтому это не собственные данные, и, следовательно, они не являются частью размера объекта vector, который возвращается sizeof. Подсчитывается только размер указателя, который указывает на эти данные. Таким образом, ваш v.resize(2000) не влияет на размер объекта, только на размер блока памяти в свободном хранилище, которое использует вектор.

0 голосов
/ 06 сентября 2011

Вы делаете некоторые вещи неправильно. Во-первых, оба типа OCtr и PCtr имеют одинаковый тип, который является вектором Test. Не из Test*, как предполагает ваш код.

Выражение PCtr.size()*sizeof(Test*) в основном бессмысленно, потому что вещи, хранящиеся в PCtr, не указатели, а целые объекты. Тем не менее, вы вычисляете размер указателя (который всегда одинаков).

В C ++, как я знаю, нет нормального способа получить общий размер объекта, если он включает динамическое размещение (как это делает вектор). Другими словами, вы делаете правильные вещи для умножения .size() на sizeof(Test), когда у вас есть контейнер объектов, но вам нужно быть более осторожным, когда вы пытаетесь создать контейнер указателей.

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