> The unserializer for prevector uses resize() for reserve the area,
> but it's prefer to use reserve() because resize() have overhead
> to call its constructor many times.
>
> However, reserve() does not change the value of "_size"
> (a private member of prevector).
>
> This PR introduce resize_uninitialized() to prevector that similar to
> resize() but does not call constructor, and added elements are
> explicitly initialized in Unserialize_imple().
>
> The changes are as follows:
> 1. prevector.h
> Add a public member function named 'resize_uninitialized'.
> This function processes like as resize() but does not call constructors.
> So added elemensts needs explicitly initialized after this returns.
>
> 2. serialize.h
> In the following two function:
> Unserialize_impl(Stream& is, prevector<N, T>& v, const unsigned char&)
> Unserialize_impl(Stream& is, prevector<N, T>& v, const V&)
> Calls resize_uninitialized() instead of resize()
>
> 3. test/prevector_tests.cpp
> Add a test for resize_uninitialized().
Benchmark details:
> [Machine]
> MacBook Pro (macOS 10.13.3/i7 2.2GHz/mem 16GB/SSD)
>
> [result]
> DeserializeAndCheckBlockTest => 22% faster
> DeserializeBlockTest => 29% faster
This is a backport of Core [[https://github.com/bitcoin/bitcoin/pull/12324 | PR12324]]