Как вектор C ++ выделяет память - PullRequest
0 голосов
/ 24 февраля 2019

Рассмотрим мой код, у меня есть вектор P, тип которого - Particle.Тогда внутри Частицы также есть вектор x, v и xBest.

Итак, это векторы внутри вектора.

struct Particle
{
    vector<double> x;
    vector<double> v;
    vector<double> xBest;
    double fitness;
    double pBest;
};

class Swarm
{
  public:
    vector<Particle> P;
    Swarm();
};

Поскольку компилятор не позволяет мне резервировать память для вектора при объявлении класса или структуры.вот так:

class Swarm
{
  public:
    vector<Particle> P(30);
    Swarm();
};

Итак, я делаю это в конструкторе так:

Swarm::Swarm()
{
    P.reserve(30);
    for(size_t i = 0; i < 30; i++)
    {
        P[i].x.reserve(10);
        P[i].v.reserve(10); 
        P[i].xBest.reserve(10);         
    }
}

И это работает.

Мне очень любопытно по этому поводу.Так как размер векторов в struct Particle еще не был инициализирован, поэтому размер Particle неизвестен.Но я могу зарезервировать память для 30 частиц еще до того, как зарезервировать память для 3 векторов в struct Particle !!

Как это возможно?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

В C ++ память, необходимая каждому объекту, известна статически, т.е. во время компиляции.В C ++ нет такого понятия, как VLA.std::vector не хранит объекты напрямую, он хранит указатель на массив в куче:

template <typename T>
class vector {
    // For illustration purposes only
    T *array;
    std::size_t size;
};

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

0 голосов
/ 24 февраля 2019

Это неопределенное поведение.Когда вы reserve вектор, вы не создаете объекты, поэтому цикл:

for(size_t i = 0; i < 30; i++)
{
    P[i].x.reserve(10);
    P[i].v.reserve(10); 
    P[i].xBest.reserve(10);         
}

вызывает reserve для векторов, которые НЕ существуют.

Вы можете 'зарезервировать емкость для векторов, которые не существуют.Сначала вам нужно создать свои Particle.

...