Как работает память, если векторы внутри массива классов динамически push_backed? - PullRequest
1 голос
/ 29 мая 2019

Предположим, что у нас есть следующий класс:

class Test {
public:
   Test() {}
   std::vector<int>& getIntList() {
      return intList;
   }
private:
   std::vector<int> intList;
};

Кроме того, у нас есть следующие коды внутри основной функции для объявления массива классов:

int main(void) {
   Test* test[20];

   for (int i = 0; i < 20; ++i) {
      test[i] = new Test();
   }
}

В этих случаях создаются тестовые объекты,

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

могут существовать шансы столкновения диапазона адресов памяти каждого вектора внутри каждого класса при изменении размера их памяти.

В этом случае весь «тестовый» объект копируется в другую область памяти, а вектор изменяется?Или вектор STL копируется только в другую область памяти и изменяет размер, пока класс ссылается на вектор?

В целом, не очень хорошая идея для такого кода?

1 Ответ

8 голосов
/ 29 мая 2019

Рассмотрим этот пример:

struct foo {
    std::vector<int> x;
    std::vector<int> y;
};

Теперь sizeof(foo) - постоянная времени компиляции.Он не изменяется при добавлении элементов в векторы.Также sizeof(std::vector<int>) постоянно.

Размер экземпляра foo не увеличивается при увеличении size() вектора.Это похоже на наличие динамического массива (только для примера):

struct bar {
   int* c_array;
};

Здесь sizeof(bar), вероятно, будет просто sizeof(int*), потому что это просто указатель, даже еслиэто может указывать на первый элемент массива в стиле c или на один int.

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