From fa8df5a4e5698224ba6024b075b72893956ac0de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Sat, 1 Apr 2023 22:32:30 -0300 Subject: [PATCH] make Array::Append faster for simple structs This makes appending arrays of simple types faster --- src/common/utility/tarray.h | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/common/utility/tarray.h b/src/common/utility/tarray.h index feb361bf88..c377f330b3 100644 --- a/src/common/utility/tarray.h +++ b/src/common/utility/tarray.h @@ -399,9 +399,16 @@ public: Grow(item.Size()); Count += item.Size(); - for (unsigned i = 0; i < item.Size(); i++) + if constexpr (std::is_trivially_copyable::value) { - new(&Array[start + i]) T(item[i]); + memcpy(Array + start,item.Array,item.Size() * sizeof(T)); + } + else + { + for (unsigned i = 0; i < item.Size(); i++) + { + new(&Array[start + i]) T(item[i]); + } } return start; } @@ -413,9 +420,16 @@ public: Grow(item.Size()); Count += item.Size(); - for (unsigned i = 0; i < item.Size(); i++) + if constexpr (std::is_trivially_copyable::value) { - new(&Array[start + i]) T(std::move(item[i])); + memcpy(Array + start,item.Array,item.Size() * sizeof(T)); + } + else + { + for (unsigned i = 0; i < item.Size(); i++) + { + new(&Array[start + i]) T(std::move(item[i])); + } } item.Clear(); return start;