
Немного на вечер C++
В SysV ABI сказано, что если у C++ типа есть нетривиальный деструктор или оператор копирования, то параметры должны передаваться по невидимому указателю. Из-за этого std::unique_ptr не такой бесплатный, как обычный указатель, см скриншот.
В Google решили опционально добавить в libc++ [[clang::trivial_abi]] к умным указателям, потому что почти ничего не сломается. А из того, что сломается, скорее всего будет багом, например, неполные типы
Или другие баги состоят в том, что деструктор unique_ptr будет вызываться не в конце функции, а после вызова владеющего объекта.
https://reviews.llvm.org/D82490
1.6% CPU по всему Google и всего лишь немного сломанных тестов. Это очень много часоразработчиков :)
В 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 и всего лишь немного сломанных тестов. Это очень много часоразработчиков :)