Как работает память, если векторы внутри массива классов динамически поддерживаются push_backed?

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

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 копируется только в другую область памяти и изменяется в размере, пока класс ссылается на вектор?

В целом, не является ли хорошей идеей такой код?

В целом, не является ли хорошей идеей такой код? Нет, забудьте об использовании new вне создания умных указателей, пока они вам действительно не понадобятся (вероятно, никогда)

463035818_is_not_a_number 29.05.2019 17:53

@formerlyknownas Я спросил, хорошо ли управлять вектором (памятью) вот так

sungjun cho 29.05.2019 17:54

Ваш вопрос совершенно не ясен, почему вы думаете, что здесь что-то может «натолкнуться»?

Jabberwocky 29.05.2019 17:54

Вы можете написать гораздо менее надуманную версию с двумя объектами std::vector<int> в локальной области видимости.

Useless 29.05.2019 17:55

я действительно не понимаю. Вы не управляете памятью векторов, вектор делает это за вас

463035818_is_not_a_number 29.05.2019 17:55

В любом случае, ответ заключается в том, что векторный объект не растет, когда вы добавляете к нему элементы — объект верхнего уровня управляет некоторым динамически выделяемым хранилищем в другом месте. Ваша ложная предпосылка состоит в том, что увеличение vector.size() влияет на sizeof(vector), а это не так.

Useless 29.05.2019 17:56

векторы не хранят свои элементы в стеке, если это ваш источник путаницы

463035818_is_not_a_number 29.05.2019 17:56

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

Ayxan Haqverdili 29.05.2019 17:56

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

Ayxan Haqverdili 29.05.2019 17:58

Это звучит как XY-проблема, чего вы пытаетесь достичь, фактически?

Jabberwocky 29.05.2019 17:58

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

sungjun cho 29.05.2019 17:58

Да, размеры векторов будут изменены, так в чем проблема?

Jabberwocky 29.05.2019 17:59
векторы внутри каждого класса не могут последовательно изменять размер своей области, -- Какое отношение один вектор имеет к другому? Это отдельные объекты — один ничего не знает или не заботится о том, что делает другой.
PaulMcKenzie 29.05.2019 17:59

Вектор не "расти внутри каждого класса" Это не дело. Vector не хранит свои данные в стеке

Ayxan Haqverdili 29.05.2019 17:59

Сорри, я думаю, мне нужно отредактировать свой вопрос.

sungjun cho 29.05.2019 18:00

связанный/возможно обман: stackoverflow.com/questions/55478523/…

NathanOliver 29.05.2019 18:01

во всяком случае, теперь я понимаю кое-что, что я пропустил

sungjun cho 29.05.2019 18:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
17
183
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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.

Вот что я хочу знать. Спасибо. Так действует ли вектор как динамический массив, инициализированный небольшим размером (программистом)?

sungjun cho 29.05.2019 18:04

@sungjuncho Да, std::vector — это динамический массив, элементы которого хранятся в куче. std::array — это статический массив, выделяемый во время компиляции, который не может изменить свой размер. И не беспокойтесь о массивах в стиле C в новом коде.

Jesper Juhl 29.05.2019 18:10

@sungjuncho хм да, вроде. std::vector это гораздо больше. Просто чтобы назвать один пример, у него есть operator==, который делает то, что вы хотите, что-то, что излишне сложно с c-массивами.

463035818_is_not_a_number 29.05.2019 18:13

Другие вопросы по теме