From ab45c58e26125bd09cac010cb9c02a0734e9c3e3 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 18 Dec 2024 13:36:11 +0000 Subject: [PATCH] Use small_vector for bonus list to reduce allocations --- AI/Nullkiller/Pathfinding/AINodeStorage.h | 2 -- Global.h | 2 ++ lib/bonuses/BonusList.cpp | 6 ------ lib/bonuses/BonusList.h | 3 +-- lib/pathfinder/CPathfinder.h | 3 --- lib/serializer/BinaryDeserializer.h | 9 +++++++++ lib/serializer/BinarySerializer.h | 9 +++++++++ 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/AI/Nullkiller/Pathfinding/AINodeStorage.h b/AI/Nullkiller/Pathfinding/AINodeStorage.h index 2761cc692..eb2a53827 100644 --- a/AI/Nullkiller/Pathfinding/AINodeStorage.h +++ b/AI/Nullkiller/Pathfinding/AINodeStorage.h @@ -23,8 +23,6 @@ constexpr int NKAI_GRAPH_TRACE_LEVEL = 0; #include "Actions/SpecialAction.h" #include "Actors.h" -#include - namespace NKAI { namespace AIPathfinding diff --git a/Global.h b/Global.h index 5e9b2c681..3589577c0 100644 --- a/Global.h +++ b/Global.h @@ -168,6 +168,8 @@ static_assert(sizeof(bool) == 1, "Bool needs to be 1 byte in size."); #include #include #include +#include +#include #include #include #include diff --git a/lib/bonuses/BonusList.cpp b/lib/bonuses/BonusList.cpp index c2d389413..1739f560a 100644 --- a/lib/bonuses/BonusList.cpp +++ b/lib/bonuses/BonusList.cpp @@ -195,7 +195,6 @@ std::shared_ptr BonusList::getFirst(const CSelector &selector) cons void BonusList::getBonuses(BonusList & out, const CSelector &selector, const CSelector &limit) const { - out.reserve(bonuses.size()); for(const auto & b : bonuses) { if(selector(b.get()) && (!limit || ((bool)limit && limit(b.get())))) @@ -259,11 +258,6 @@ void BonusList::resize(BonusList::TInternalContainer::size_type sz, const std::s changed(); } -void BonusList::reserve(TInternalContainer::size_type sz) -{ - bonuses.reserve(sz); -} - void BonusList::insert(BonusList::TInternalContainer::iterator position, BonusList::TInternalContainer::size_type n, const std::shared_ptr & x) { bonuses.insert(position, n, x); diff --git a/lib/bonuses/BonusList.h b/lib/bonuses/BonusList.h index 3629cdf9c..66b4f2b42 100644 --- a/lib/bonuses/BonusList.h +++ b/lib/bonuses/BonusList.h @@ -17,7 +17,7 @@ VCMI_LIB_NAMESPACE_BEGIN class DLL_LINKAGE BonusList { public: - using TInternalContainer = std::vector>; + using TInternalContainer = boost::container::small_vector, 16>; private: TInternalContainer bonuses; @@ -43,7 +43,6 @@ public: void clear(); bool empty() const { return bonuses.empty(); } void resize(TInternalContainer::size_type sz, const std::shared_ptr & c = nullptr); - void reserve(TInternalContainer::size_type sz); TInternalContainer::size_type capacity() const { return bonuses.capacity(); } STRONG_INLINE std::shared_ptr &operator[] (TInternalContainer::size_type n) { return bonuses[n]; } STRONG_INLINE const std::shared_ptr &operator[] (TInternalContainer::size_type n) const { return bonuses[n]; } diff --git a/lib/pathfinder/CPathfinder.h b/lib/pathfinder/CPathfinder.h index 4791a450f..9a903ced1 100644 --- a/lib/pathfinder/CPathfinder.h +++ b/lib/pathfinder/CPathfinder.h @@ -13,9 +13,6 @@ #include "../IGameCallback.h" #include "../bonuses/BonusEnum.h" -#include -#include - VCMI_LIB_NAMESPACE_BEGIN class CGWhirlpool; diff --git a/lib/serializer/BinaryDeserializer.h b/lib/serializer/BinaryDeserializer.h index 9db041b2e..25c232ca5 100644 --- a/lib/serializer/BinaryDeserializer.h +++ b/lib/serializer/BinaryDeserializer.h @@ -215,6 +215,15 @@ public: load( data[i]); } + template + void load(boost::container::small_vector& data) + { + uint32_t length = readAndCheckLength(); + data.resize(length); + for (uint32_t i = 0; i < length; i++) + load(data[i]); + } + template , int > = 0> void load(std::deque & data) { diff --git a/lib/serializer/BinarySerializer.h b/lib/serializer/BinarySerializer.h index 851d53836..738cf17c1 100644 --- a/lib/serializer/BinarySerializer.h +++ b/lib/serializer/BinarySerializer.h @@ -275,6 +275,15 @@ public: for(uint32_t i=0;i + void save(const boost::container::small_vector& data) + { + uint32_t length = data.size(); + *this& length; + for (uint32_t i = 0; i < length; i++) + save(data[i]); + } + template , int > = 0> void save(const std::deque & data) {