[libcxx-dev] std::vector using copy constructor on existing elements during reserve()
Duncan P. N. Exon Smith via libcxx-dev
libcxx-dev at lists.llvm.org
Wed Apr 17 09:57:08 PDT 2019
Concretely, in LLVM, I committed r266909 and r267299 (use SmallVector instead of std::vector) because it didn't make sense to litter an -fno-exceptions code base with `noexcept`.
> On Apr 17, 2019, at 09:39, Duncan P. N. Exon Smith via libcxx-dev <libcxx-dev at lists.llvm.org> wrote:
>
> I'm curious about how people feel this should/could behave with -fno-exceptions. IIRC, Libc++ calls the copy constructor (following the standard), but -fno-exceptions isn't really standard, and from a user perspective that doesn't make sense. `noexcept` is essentially meaningless with -fno-exceptions.
>
> Thoughts?
>
>> On Apr 16, 2019, at 23:19, Eric Fiselier via libcxx-dev <libcxx-dev at lists.llvm.org <mailto:libcxx-dev at lists.llvm.org>> wrote:
>>
>>
>>
>> On Tue, Apr 16, 2019 at 2:25 PM Michael Narigon via libcxx-dev <libcxx-dev at lists.llvm.org <mailto:libcxx-dev at lists.llvm.org>> wrote:
>> std:vector is using the element copy constructor on existing elements during its resizing operation in reserve(). I would expect it to use the move constructor for efficiency. Is this intended behavior?
>>
>> Yes, this behavior is mandated by the standard. The copy constructor is used when the move constructor is not noexcept. From cppreference's `std::move_if_noexcept` documentation:
>>
>> std::vector::resize <https://en.cppreference.com/w/cpp/container/vector/resize>, which may have to allocate new storage and then move or copy elements from old storage to new storage.
>> If an exception occurs during this operation, std::vector::resize <https://en.cppreference.com/w/cpp/container/vector/resize> undoes everything it did to this point, which is only possible if
>> std::move_if_noexcept was used to decide whether to use move construction or copy construction. (unless copy constructor is
>> not available, in which case move constructor is used either way and the strong exception guarantee may be waived)
>> https://en.cppreference.com/w/cpp/utility/move_if_noexcept <https://en.cppreference.com/w/cpp/utility/move_if_noexcept>
>>
>> If you add `noexcept` to your move constructor, vector should call the move constructor.
>>
>>
>>
>>
>> This is with the libc++ delivered with Xcode 10.1.
>>
>> Attached is a sample program displaying the behavior.
>> _______________________________________________
>> libcxx-dev mailing list
>> libcxx-dev at lists.llvm.org <mailto:libcxx-dev at lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev <https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev>
>> _______________________________________________
>> libcxx-dev mailing list
>> libcxx-dev at lists.llvm.org <mailto:libcxx-dev at lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev
>
> _______________________________________________
> libcxx-dev mailing list
> libcxx-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/libcxx-dev/attachments/20190417/05f852a5/attachment-0001.html>
More information about the libcxx-dev
mailing list