Make `vector` unconditionally move elements when exceptions are disabled.
authorEric Fiselier <eric@efcs.ca>
Fri, 30 Aug 2019 19:01:03 +0000 (19:01 +0000)
committerEric Fiselier <eric@efcs.ca>
Fri, 30 Aug 2019 19:01:03 +0000 (19:01 +0000)
commit2dd37a31ce14720d967cbe87b1b3a058871c9651
tree38b3a13faa9fe90b3447e4a9a98e9e34e4751517
parent7b832322dfe60fbc39d4814c5343cea8c8bb29ee
Make `vector` unconditionally move elements when exceptions are disabled.

Summary:
`std::vector<T>` is free choose between using copy or move operations when it needs to resize. The standard only candidates that the correct exception safety guarantees are provided. When exceptions are disabled these guarantees are trivially satisfied. Meaning vector is free to optimize it's implementation by moving instead of copying.

This patch makes `std::vector` unconditionally move elements when exceptions are disabled.

This optimization is conforming according to the current standard wording.

There are concerns that moving in `-fno-noexceptions`mode will be a surprise to users. For example, a user may be surprised to find their code is slower with exceptions enabled than it is disabled. I'm sympathetic to this surprised, but I don't think it should block this optimization.

Reviewers: mclow.lists, ldionne, rsmith

Reviewed By: ldionne

Subscribers: zoecarver, christof, dexonsmith, libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D62228

llvm-svn: 370502
libcxx/include/memory
libcxx/include/vector
libcxx/test/libcxx/containers/sequences/vector/exception_safety_exceptions_disabled.sh.cpp [new file with mode: 0644]