Использование 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]};