LINUX.ORG.RU

Потому что это не java, в C++ методы не в почёте (до сих пор каются, что надобавляли кучу в basic_string).

anonymous
()

Потому что интерфейсы в STL — merdeболь

XMs ★★★★★
()

Потому что слово «шоткат» не существует.

Partisan ★★★★★
()

Потому что почти всегда shared_ptr указывает на базовый класс, а ресетится тем, что пришло из фабрики.

vzzo ★★★
()

Потому что этот шорткат ничего не сокращает.

oldstable
()

Это не shortcut, а функция, позволяющая сэкономить 1 вызов аллокатора памяти.

m0rph ★★★★★
()
Ответ на: комментарий от pon4ik

Тем не менее, вот такое реализуемо:

std::unique_ptr<Base> ptr;
ptr.emplace<Derived>(arg1, arg2);

Хотя ИМХО, = std::make_unique<Derived>(arg1, arg2) как-то нагляднее.

KennyMinigun ★★★★★
()
Ответ на: комментарий от anonymous

Оно должно создавать объект в сторадже старого объекта?

Если новый обьект влазит в аллоцированную память, то как оптимизация может быть. Номинально, следует выделить новый кусок памяти а старый удалить (если он имеется).

KennyMinigun ★★★★★
()
Ответ на: комментарий от anonymous

в какой современной реализации это не так?

Реализации метода я не нашел (даже в расширениях). Хотя с другой стороны, clang 6.0 на amd64 порешал все через constant propagation: https://godbolt.org/z/SQMa0E

#include <memory>

struct Foo {int bar;};

int f(std::unique_ptr<Foo> &ptr) {
    ptr = std::make_unique<Foo>(Foo{4});
    return ptr->bar;
}

int main() {
    auto a = std::make_unique<Foo>(Foo{3});
    return f(a) - 4;
}

/*
main:                                   # @main
        xor     eax, eax
        ret
*/

А GCC 8 таки не смог (даже с -O3): https://godbolt.org/z/0rsT0s

C другой стороны, я все же посыпаю голову пеплом, ибо f() таки остался как и был (if (ptr) delete ptr; ptr = new). Что, впрочем, не значит, что других оптимизаций не будет.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от anonymous

мы, вообще-то, про shared_ptr

Он создает много лишнего шума в ассемблере своим подсчетом ссылок и его guard-ами. Я себе подумал, что суть в unique_ptr останется той же относительно действий с владеемой памятью (обьектом).

Хотя да, оптимизациям сложно через барьеры прыгать.

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Если новый обьект влазит в аллоцированную память, то как оптимизация может быть.

Создаст проблемы с объектами с ссылочными и константными мемберами.

anonymous
()
Ответ на: комментарий от anonymous

Создаст проблемы с объектами с ссылочными и константными мемберами.

Не должно, если вызвать деструктор а потом конструктор (in-place).

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun
std::shared_ptr<A> a = new A(...);

два выделения: одно под A, второе — под счётчик ссылок.

std::shared_ptr<A> a = std::make_shared<A>(...);

одно выделение. функция делает всю магию сама.

anonymous
()
Ответ на: комментарий от KennyMinigun

Не должно, если вызвать деструктор а потом конструктор (in-place).

Ты хотел сказать «не должно, если использовать std::launder»?

anonymous
()
Ответ на: комментарий от anonymous

Ты хотел сказать «не должно, если использовать std::launder»?

Я таки слышал о std::launder ;) Но спасибо за напоминание. В смысле да.

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.