From 18b94b517d808bfaf8ba1559c45de61b403ff52a Mon Sep 17 00:00:00 2001 From: Ho Cheung Date: Sat, 25 Jan 2025 20:59:55 +0800 Subject: [PATCH] [rtc_base] Replace manual element initialization and movement with C++17 standard functions This CL focuses on addressing the remaining TODO items in the `//rtc_base/bounded_inline_vector_impl.h` file, mainly involving the two functions `void DefaultInitializeElements` and `void MoveElements`. In the `void DefaultInitializeElements` function, the placement new usage is adopted. When using placement new, manual construction operations on objects are usually required, and a fair amount of logic needs to be written to ensure correct object construction. In contrast, the `std::uninitialized_default_construct_n()` function only requires passing in the starting address of the memory and the number of objects to be constructed, and it can automatically construct objects in batches. In the `void MoveElements` function, the original implementation also uses the placement new usage. When using placement new to move objects, manual handling of the moving operation for each object is required, and usually, `std::move` needs to be combined to achieve the object's move semantics. However, the `std::uninitialized_move_n()` function can automatically complete the object moving process just by passing in specific parameters. To improve the code's simplicity, it is considered to use `std::uninitialized_default_construct_n()` and `std::uninitialized_move_n()` to replace the original two placement new usages. Fixed: webrtc:392037564 Change-Id: If8edcd9ac8a4d85be0ce0a23f6433d7f91b39ad3 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/375182 Reviewed-by: Mirko Bonadei Reviewed-by: Harald Alvestrand Commit-Queue: Mirko Bonadei Auto-Submit: Ho Cheung Cr-Commit-Position: refs/heads/main@{#43831} --- rtc_base/bounded_inline_vector_impl.h | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/rtc_base/bounded_inline_vector_impl.h b/rtc_base/bounded_inline_vector_impl.h index 3539ace5bc..82b11b8db6 100644 --- a/rtc_base/bounded_inline_vector_impl.h +++ b/rtc_base/bounded_inline_vector_impl.h @@ -46,13 +46,9 @@ void InitializeElements(T* data, U&& element, Us&&... elements) { } // Default initializes uninitialized array elements. -// TODO(kwiberg): Replace with std::uninitialized_default_construct_n() (C++17). template void DefaultInitializeElements(T* data, int size) { - for (int i = 0; i < size; ++i) { - // Placement new, because we construct a new object in uninitialized memory. - ::new (&data[i]) T; - } + std::uninitialized_default_construct_n(data, size); } // Copies from source to uninitialized destination. Caller is responsible for @@ -74,12 +70,7 @@ void MoveElements(T* src_data, int src_size, T* dst_data, int* dst_size) { if /*constexpr*/ (std::is_trivially_move_constructible::value) { std::memcpy(dst_data, src_data, src_size * sizeof(T)); } else { - // TODO(kwiberg): Use std::uninitialized_move_n() instead (C++17). - for (int i = 0; i < src_size; ++i) { - // Placement new, because we create a new object in uninitialized - // memory. - ::new (&dst_data[i]) T(std::move(src_data[i])); - } + std::uninitialized_move_n(src_data, src_size, dst_data); } *dst_size = src_size; }