Создание std::shared_ptr
через std::make_shared
может быть полезным в следующем случае:
boo(std::shared_ptr<Bar>(new Bar), foo());
здесь может быть утечка, если foo
бросит исключение, и
boo(std::make_shared<Bar>(), foo());
исключит утечку памяти.
Вопрос: в общем случае, например
std::shared_ptr<Bar> pBar(new Bar);
лучше использовать new
или использовать std::make_shared
?
Из Скотт Мейерс - "Эффективный и современный С++ 11/14" (глава 4.4):
Особенностью std::make_shared (по сравнению с непосредственным использованием new) является повышенная эффективность. Применение std::make_shared позволяет компиляторам генерировать меньший по размеру и более быстрый код, использующий более компактные структуры данных.
Там написано достаточно детально (рекомендую почитать), но вкратце в случае
std::shared_ptr<Bar> pBar(new Bar);
произойдет 2 выделения памяти: одно для new Bar
, другое для управляющего блока умного указателя.
В случае же
auto pBar = std::make_shared<Bar>();
может быть выполнено одно выделение с последующим размещением объекта Bar
в управляющем блоке умного указателя. Таким образом количество выделений памяти может быть сокращено до одного.
Что именно попадет в исполняемый файл зависит от оптимизаций компилятора.
В целом же автор рекомендует:
предпочитайте использование std::make_unique и std::make_shared непосредственному использованию оператора new
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть двумерный вектор: vector<vector<int>> a(n, vector<int>(c+1, 0))И хочется изменить все его элементы на определенну константу (например 1)
Является ли оператор функцией? Например при перегрузке оператора присваивания для определенного класса, мы можем вызвать его как обычную...
Есть простая программа, которая должна реагировать на клавишу, и задавать шару ускорение, когда клавиша отпускаеться, шар движется с прежней...