On Mon, Oct 14, 2019 at 3:58 AM Henri Sivonen <hsivo...@mozilla.com> wrote: > On Mon, Oct 14, 2019 at 9:05 AM Gerald Squelart <gsquel...@mozilla.com> wrote: > > > > I'm in the middle of watching Chandler Carruth's CppCon talk "There Are No > > Zero-Cost Abstractions" and there's this interesting insight: > > https://youtu.be/rHIkrotSwcc?t=1041 > > > > The spoiler is already in the title (sorry!), which is that passing > > std::unique_ptr by value is more expensive than passing it by rvalue > > reference, even with no exceptions! > > > > I wrote the same example using our own mozilla::UniquePtr, and got the same > > result: https://godbolt.org/z/-FVMcV (by-value on the left, by-rref on the > > right.) > > So I certainly need to recalibrate my gutfeelometer. > > The discussion in the talk about what is needed to fix this strongly > suggested (without uttering "Rust") that Rust might be getting this > right. With panic=abort, Rust gets this right ( > https://rust.godbolt.org/z/SZQaAS ) which really makes one appreciate > both Rust-style move semantics and the explicitly not-committal ABI.
With a little voodoo placement of [[clang::trivial_abi]] (https://quuxplusone.github.io/blog/2018/05/02/trivial-abi-101/, https://reviews.llvm.org/D41039) on Pair specializations and UniquePtr itself, one can make the by-value function look more like what you might expect, but at the cost (!) of making the rvalue-ref function look more like the original by-value function, https://godbolt.org/z/A1wjl8. I think that's a reasonable tradeoff to make if we wanted to start using [[clang::trivial_abi]]. -Nathan _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform