Немного на вечер C++



В SysV ABI сказано, что если у C++ типа есть нетривиальный деструктор или оператор копирования, то параметры должны передаваться по невидимому указателю. Из-за этого std::unique_ptr не такой бесплатный, как обычный указатель, см скриншот.



В Google решили опционально добавить в libc++ [[clang::trivial_abi]] к умным указателям, потому что почти ничего не сломается. А из того, что сломается, скорее всего будет багом, например, неполные типы



class Foo;

void func(std::unique_ptr<Foo> arg) { /* never use `arg` directly */ }




Или другие баги состоят в том, что деструктор unique_ptr будет вызываться не в конце функции, а после вызова владеющего объекта.



void func() {

std::unique_ptr<Foo> smart_foo = ...;

Foo* owned_foo = smart_foo.get();

owned_foo->Bar(run_worker(std::move(smart_foo)));

^

// <<<Crash expected here

}




https://reviews.llvm.org/D82490



1.6% CPU по всему Google и всего лишь немного сломанных тестов. Это очень много часоразработчиков :)