Использование new для выделения смежного пространства против использования вектора?

Зачем использовать новую область памяти, как это, когда у нас есть векторы?
Есть ли преимущества?

bool* arr = new bool(size);

Мне не ясно, что делает эта линия, но что я чувствую, так это std::memset устанавливает что угодно param2 дается во всех местах, начиная с адреса в param1 и заканчивается в данном размере

std::memset(arr, 0, sizeof(bool) * (num+1));

2 ответа

Решение

Что это за линия bool* arr = new bool(size); делает?

Эта строка выделяет логическое значение в куче и инициализирует его true если size != 0 и к false если size == 0, Затем он присваивает адрес недавно выделенного логического значения булевому указателю arr, Так что нет никаких массивов, чтобы играть здесь.

Как я мог бы выделить массив логических с new?

Правильный способ размещения массива в куче - использовать оператор new[], Это в вашем случае:

bool* arr = new bool[size];

С появлением умных указателей вы также можете использовать std::unique_ptr:

std::unique_ptr<bool[]> arr(new bool[size]);

Таким образом, вам не придется delete [] после этого.

Зачем использовать новое распределение памяти, как это, когда у нас есть векторы?

Хорошо с любым другим типом кроме bool Я бы согласился, но дело в том, что есть определенные проблемы с std::vector<bool>,

std::vector<bool> это специализация std::vector<T> это сделано главным образом для космической эффективности (дискуссионный).

Тем не менее, он ведет себя так же, но не так, как обычный std::vector<T>, Это связано главным образом с тем, что std::vector<bool> это не контейнер в обычном смысле STL, а массив битов. В общем, использование std::vector<bool> может привести к многочисленным разрушениям, это считается преждевременной оптимизацией и может даже привести к пессимизации вашей производительности (более подробную информацию см. здесь).

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

Как насчет std::memset(arr, 0, sizeof(bool) * (size));?

std::memset инициализирует определенное количество байтов в памяти (т. е. третий входной аргумент) с заданным значением (т. е. вторым входным аргументом), начиная с адреса arr (т.е. первый входной аргумент). В приведенном выше примере он заполнит arr с 0 до size количество байтов. Это если arr массив размеров size он инициализирует все элементы этого логического массива в false,

Однако, альтернативно, вы можете использовать следующую схему:

bool* arr = new bool[size]();
                          ^^

или же

std::unique_ptr<bool[]> arr(new bool[size]());

И, таким образом, избегайте обращений к необработанным манипуляторам памяти. std::memset которые попадают в категорию использования с осторожностью.

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

Мы не можем знать, почему автор использовал новое здесь. Идиоматическим способом было бы использовать std::vector<bool>

Есть ли преимущества?

Обычно нет, но особенно std::vector<bool> проблематично, потому что есть специализация, которая не работает как для других типов.

На SO так много вопросов:

Мне не ясно, что делает эта линия, но что я чувствую...

Твои кишки правы.


Примечание. Код для выделения непрерывного массива boolс new было бы

bool* arr = new bool[size];

Вместо необработанного указателя вы можете использовать умный указатель для выделения массива, и вам не нужно заботиться о delete []:

std::unique_ptr<bool[]> arr{new bool[size]};
Другие вопросы по тегам