diff --git a/core/templates/local_vector.h b/core/templates/local_vector.h index 3992954743e..3983deea886 100644 --- a/core/templates/local_vector.h +++ b/core/templates/local_vector.h @@ -58,9 +58,7 @@ public: // Must take a copy instead of a reference (see GH-31736). _FORCE_INLINE_ void push_back(T p_elem) { if (unlikely(count == capacity)) { - capacity = tight ? (capacity + 1) : MAX((U)1, capacity << 1); - data = (T *)memrealloc(data, capacity * sizeof(T)); - CRASH_COND_MSG(!data, "Out of memory"); + reserve(count + 1); } if constexpr (!std::is_trivially_constructible_v && !force_trivial) { @@ -145,10 +143,16 @@ public: } _FORCE_INLINE_ bool is_empty() const { return count == 0; } _FORCE_INLINE_ U get_capacity() const { return capacity; } - _FORCE_INLINE_ void reserve(U p_size) { - p_size = tight ? p_size : nearest_power_of_2_templated(p_size); + void reserve(U p_size) { if (p_size > capacity) { - capacity = p_size; + if (tight) { + capacity = p_size; + } else { + capacity = MAX((U)2, capacity + ((1 + capacity) >> 1)); + if (p_size > capacity) { + capacity = p_size; + } + } data = (T *)memrealloc(data, capacity * sizeof(T)); CRASH_COND_MSG(!data, "Out of memory"); } @@ -163,11 +167,7 @@ public: } count = p_size; } else if (p_size > count) { - if (unlikely(p_size > capacity)) { - capacity = tight ? p_size : nearest_power_of_2_templated(p_size); - data = (T *)memrealloc(data, capacity * sizeof(T)); - CRASH_COND_MSG(!data, "Out of memory"); - } + reserve(p_size); if constexpr (!std::is_trivially_constructible_v && !force_trivial) { memnew_arr_placement(data + count, p_size - count); } diff --git a/servers/rendering/rendering_device_driver.h b/servers/rendering/rendering_device_driver.h index 31517ea5820..0cacc0a475c 100644 --- a/servers/rendering/rendering_device_driver.h +++ b/servers/rendering/rendering_device_driver.h @@ -625,7 +625,7 @@ public: }; struct AttachmentReference { - static const uint32_t UNUSED = 0xffffffff; + static constexpr uint32_t UNUSED = 0xffffffff; uint32_t attachment = UNUSED; TextureLayout layout = TEXTURE_LAYOUT_UNDEFINED; BitField aspect = {};