Skip to content

Winteradio/MemoryPool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

74 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Log & Memory Project

English Version

Link to ENG README.md

MemoryProject Tutorial

Link to Tutorial

์ง„ํ–‰ ๊ธฐ๊ฐ„: 2023/03/01 โ†’ 2023/08/13 ์Šคํ‚ฌ: C++, CMake


MemoryManager.jpg

์š”์•ฝ

  • ECS๋ฅผ ์œ„ํ•œ ๋ถ€์ˆ˜์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑ
    • Log Project
    • Memory Project

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์–ธ์–ด
    • C++

๐Ÿ“ ๊ธฐ๋ณธ ์„ค๋ช…

Log

  • ์—”์ง„ ์ƒ์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ
  • Log ์ •๋ณด๋“ค์„ ๋”ฐ๋กœ ์ €์žฅ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์–ด์•ผ ํ•จ
  • ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋‚˜๋ˆ  ์ค„ ํ•„์š”๊ฐ€ ์žˆ์Œ
    • Info : ์ผ๋ฐ˜์ ์ธ ์ •๋ณด
    • Warn : ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊นŒ์ง€๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ฃผ์˜ํ•ด์•ผ ๋  ์ •๋ณด
    • Error: ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜, ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์ง„ ์ •๋ณด

Memory Pool & Manager

  • ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ธฐํ™” ๋ฐ ํ• ๋‹น ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ
  • ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ค‘์•™ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ

Memory Ptr

  • ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„
  • ECS ์ƒ์—์„œ ๊ฐ์ฒด๋“ค์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ
  • Memory Manager์—์„œ๋งŒ ์†Œ๋ฉธ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •

CMake๋ฅผ ํ™œ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒ์„ฑ ๋ฐ ์˜์กด์„ฑ ์„ค์ •

  • Log, Memory Project๋“ค์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” CMakelists ์„ค์ •
  • Github์— ํ•ด๋‹น Repository๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐํ•˜์—ฌ ์˜์กด์„ฑ ์„ค์ •ํ•œ ํ›„ ์‚ฌ์šฉ

๐Ÿ“ ๊ฐœ๋ฐœ ๋‚ด์šฉ

[ Memory Project ]

์ธํ„ฐํŽ˜์ด์Šค

  • IMemoryPool

ํด๋ž˜์Šค

  • MemoryPool( Parent : IMemoryPool )
  • MemoryPtr

๋งค๋‹ˆ์ €

  • MemoryManager

[ ๊ณตํ†ต ]

CMakelists ์„ค์ •

[ Log Project ]

ํด๋ž˜์Šค

  • Log

๐Ÿ“ ์ƒ์„ธ ๊ฐœ๋ฐœ ๋‚ด์šฉ

์ธํ„ฐํŽ˜์ด์Šค

  • IMemoryPool
    • MemoryPool๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

      class IMemoryPool
      {
          public:
              IMemoryPool() {}
              virtual ~IMemoryPool() {}
      
          public:
              virtual void Init() = 0;
              virtual void Destroy() = 0;
              virtual bool CheckFull() = 0;
              virtual bool CheckEmpty() = 0;
      
          public :
              virtual const size_t& GetTotalSize() = 0;
              virtual const size_t& GetObjectSize() = 0;
              
              virtual char*& GetStartPtr() = 0;
      };

ํด๋ž˜์Šค

  • MemoryPool

    • ์ฃผ๋œ ์—ญํ• 
      • ์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ ํ•ด์ œํ•˜๋Š” ์ฃผ๋œ ๊ฐ์ฒด
      • ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ํ• ๋‹น ๋ฐ›์œผ๋ฉฐ, ์ดˆ๊ธฐํ™”์™€ ์†Œ๋ฉธ์ž๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌ
    • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ
      • MemoryPool์—์„œ ์ฒ˜์Œ์— ํ• ๋‹น ๋ฐ›์€ ์ฃผ์†Œ์™€ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์— ๋Œ€ํ•œ ์˜ค๋ธŒ์ ํŠธ ํฌ๊ธฐ์˜ ์ธ๋ฑ์Šค ์ •๋ณด๋กœ ๊ด€๋ฆฌ

        • ์˜ˆ๋ฅผ ๋“ค์–ด
          • ํ• ๋‹น ๋ฐ›์€ ์ฃผ์†Œ : 01
          • ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ : 8
          • ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์ด์ฆˆ : 2
          • ๊ฐ€๋Šฅํ•œ ์˜ค๋ธŒ์ ํŠธ ์ธ๋ฑ์Šค( ์ฃผ์†Œ ) : 0( 01 ), 1( 03 ), 2( 05 ), 3(07 )
      • ์ฒ˜์Œ MemoryPool์ด ์ƒ์„ฑ๋  ๋•Œ, ์ฃผ์–ด์ง„ ํ• ๋‹น ์‚ฌ์ด์ฆˆ๋ฅผ ํ™•์ธ ํ›„ ํ• ๋‹น ๋ฐ›์Œ

        • void Init()

          • malloc์„ ํ†ตํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋งŒ ์ง„ํ–‰
          • m_CanConstruct์— ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ Index ๊ธฐ์ž…
          • m_CanConstruct
            • ์ดˆ๊ธฐํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์˜ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ์ง€๋‹Œ ํ
          • m_CanDestruct
            • ์†Œ๋ฉธ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์˜ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ์ง€๋‹Œ ํ
          void Init()
                  {
                      m_pStart = static_cast<char*>( std::malloc( m_TotalSize ) );
          
                      for ( size_t I = 0; I < m_TotalSize / m_ObjectSize; I++ )
                      {
                          m_CanConstruct.push( static_cast<int>( I ) );
                      }
          
                      m_CanDestruct.clear();
                      m_CanDestruct.reserve( static_cast<int>( m_TotalSize / m_ObjectSize ) );
          
                      return;
                  }
      • ์ฃผ์–ด์ง„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ MemoryPool์ด ์†Œ๋ฉธ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋จ

    • ์ธ์Šคํ„ด์Šค ๊ด€๋ฆฌ ๊ด€๋ จ
      • ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ์„ ์ธ์Šคํ„ด์Šค์˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์„œ ๊ด€๋ฆฌ
        • m_CanConstruct

          • ์ดˆ๊ธฐํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์˜ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ์ง€๋‹Œ ํ
        • m_CanDestruct

          • ์†Œ๋ฉธ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋“ค์˜ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค ์ •๋ณด๋ฅผ ์ง€๋‹Œ ํ
        • ์ƒ์„ฑ ๊ด€๋ จ

          • template< typename โ€ฆ Args > T Construct( Args&&โ€ฆ args )*
            • CheckFull()
              • ํ•ด๋‹น MemoryPool์ด ๊ฐ€๋“ ์ฐผ๋Š”์ง€ ํ™•์ธ
              • m_CanConstruct๊ฐ€ ๋น„์—ˆ์„ ์‹œ, true
            • ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„์น˜์ง€์ • new๋ฅผ ํ˜ธ์ถœ
          template< typename ... Args >
          T* Construct( Args&&... args )
          {
              if ( CheckFull() )
              {
                  throw Except( " MemoryPool | %s | %s | This MemoryPool is full ", __FUNCTION__, typeid( T ).name() );
              }
          
              int Index = m_CanConstruct.front();
              m_CanDestruct.push_back( Index );
              m_CanConstruct.pop();
              
              T* Ptr = new ( GetStartPtr() + Index * GetObjectSize() ) T( std::forward<Args>( args ) ... );
          
              Log::Info( " Instance | %s | %p | Create new ", typeid( T ).name(), Ptr );
          
              return Ptr;  
          }
        • ์†Œ๋ฉธ ๊ด€๋ จ

          • void Destruct( T& Ptr )*

            • Ptr์„ ์ด์šฉํ•˜์—ฌ์„œ, MemoryPool์—์„œ ์†Œ๋ฉธ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” Index ํ™•์ธ
            • Index๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ
              • ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  nullptr ๊ธฐ์ž…
              • m_CanConstruct์™€ m_CanDestruct ์ตœ์‹ ํ™”
            void Destruct( T*& Ptr )
                    {
                        int Index = static_cast<int>( ( reinterpret_cast<char*>( Ptr ) - GetStartPtr() ) / GetObjectSize() );
            
                        auto ITR = std::remove( m_CanDestruct.begin(), m_CanDestruct.end(), Index );
            
                        if ( ITR != m_CanDestruct.end() )
                        {
                            Log::Info( " Instance | %s | %p | Delete ", typeid( T ).name(), Ptr );
                            
                            m_CanDestruct.erase( ITR, m_CanDestruct.end() );
                            Ptr->~T();
                            Ptr = nullptr;
                            m_CanConstruct.push( Index );
                        }
                        else
                        {
                            throw Except(" Instance | %s | %p | This memorypool has not this instance ", typeid( T ).name(), Ptr );        
                        }
                    }
  • MemoryPtr

    • ์ฃผ๋œ ์—ญํ• 

      • ์™ธ๋ถ€์—์„œ์˜ ํฌ์ธํ„ฐ ํ•ด์ œ์— ๋Œ€ํ•œ ๋ณดํ˜ธ์—ญํ•  ๋ฐ ์บ์ŠคํŒ…์„ ์œ„ํ•œ ์šฉ๋„
    • ํฌ์ธํ„ฐ ๊ด€๋ จ

      • ํฌ์ธํ„ฐ๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋Š” ์—ญํ• ์€ ์˜ค์ง MemoryManager

        • template< typename U > friend class MemoryPtr;
          • ๋‹ค๋ฅธ ํ…œํ”Œ๋ฆฟ MemoryPtr์—์„œ๋„ ์„œ๋กœ private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก
        private :
                friend class MemoryManager;
        
                template< typename U >
                friend class MemoryPtr;
      • RTTI๋ฅผ ํ†ตํ•œ ์บ์ŠคํŒ…์ด ๊ฐ€๋Šฅ

        template< typename U >
                bool CheckValidityofCopy( U*& otherPtr )
                {
                    if ( otherPtr == nullptr )
                    {
                        Log::Warn( " MPTR | %s | %s | The pointer is empty ", __FUNCTION__, typeid( T ).name() );
                        return false;
                    }
        
                    if ( m_Ptr != nullptr )
                    {
                        Log::Warn( " MPTR | %s | %s | Already pointer existed %p", __FUNCTION__, typeid( T ).name(), m_Ptr );
                        return false;
                    }
        
                    T* mainPtr = dynamic_cast< T* >( otherPtr );
                    if ( mainPtr == nullptr )
                    {
                        Log::Warn( " MPTR | %s | %s | No inheritance relationship with %s ", __FUNCTION__, typeid( T ).name(), typeid( U ).name() );
                        return false;
                    }
        
                    m_Ptr = mainPtr;
                    return true;
                }
    • MemoryPool ๊ด€๋ จ

      • MemoryPool์˜ Start Pointer๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์–ด์„œ MemoryManager์—์„œ ๊ด€๋ฆฌ๊ฐ€ ํŽธ๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ
      public :
      
      char* GetPoolPtr() { return m_PoolPtr; }
      void SetPoolPtr( char* Start )
      {
          bool Check = ( Start != m_PoolPtr ) || ( Start != nullptr );
          if ( Check ) m_PoolPtr = Start;
      }
      
      private :
              T* m_Ptr = nullptr;
              char* m_PoolPtr;

๋งค๋‹ˆ์ €

  • MemoryManager
    • ์ฃผ๋œ ์—ญํ• 

      • MemoryPool์„ ์ƒ์„ฑ ๋ฐ ์‚ญ์ œํ•˜๋Š” ์—ญํ• 
      • ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™” ๋ฐ ์†Œ๋ฉธํ•˜๋Š” ์—ญํ• 
    • MemoryPool ๊ด€๋ จ

      • ์ ‘๊ทผ ๋ฐฉ์‹

        • Start Pointer๋กœ MemoryPool์— ์ ‘๊ทผ

        • Start Pointer์˜ ๋ฆฌ์ŠคํŠธ๋Š” Type๋ณ„๋กœ ์ €์žฅ

          using IMemoryPoolPtrList = std::list< char* >;
          using IMemoryPoolMap = std::unordered_map< char*, IMemoryPool* >;
          using TypePoolPtrListMap = std::unordered_map< const std::type_info*, IMemoryPoolPtrList >;
          
          IMemoryPoolMap m_IMemoryPoolMap;
          TypePoolPtrListMap m_TypePoolPtrListMap;
      • ์ƒ์„ฑ ๊ด€๋ จ

        • template< typename T > void CreateMemoryPool( size_t Size )

          • m_IMemoryPoolMap
            • Start Pointer์„ ์‚ฌ์šฉํ•˜์—ฌ IMemoryPool์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ
            • Key : Start Pointer
            • Value : IMemoryPool Pointer
          • m_TypePoolPtrListMap
            • Type ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ Start Pointer๋“ค ๋ฐ์ดํ„ฐ๋“ค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ
            • Key : const std::type_info*
            • Value : Start Pointer Set
          template< typename T >
          void CreateMemoryPool( size_t Size )
          {
              IMemoryPool* iMemoryPool = new MemoryPool<T>( Size );
              iMemoryPool->Init();
              m_IMemoryPoolMap[ iMemoryPool->GetStartPtr() ] = iMemoryPool;
              m_TypePoolPtrListMap[ &typeid( T ) ].push_back( iMemoryPool->GetStartPtr() );
          
              Log::Info( " MemoryManager | %s | Pool Ptr %p - Start Ptr %p | Create new memory pool ", typeid( T ).name(), iMemoryPool, iMemoryPool->GetStartPtr() );
          }
    • ์ธ์Šคํ„ด์Šค ๊ด€๋ จ

      • ์ƒ์„ฑ ๊ด€๋ จ

        • ํ•˜๋‚˜์˜ MemoryPool์— ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑํ• ์ง€, ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ƒ์„ฑํ• ์ง€ ์„ค์ • ๊ฐ€๋Šฅ

          • template< typename T, typenameโ€ฆ Args > MemoryPtr Create( Args&&โ€ฆ args )

            • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
          • template< typename T, typenameโ€ฆ Args > MemoryPtr CreateOne( Args&&โ€ฆ args )

            • ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ์„ ์ƒ์„ฑ
            template< typename T, typename... Args >
            MemoryPtr<T> Create( Args&&... args )
            {
                size_t Size = m_DefaultSize;
            
                return MainCreate<T>( Size, std::forward<Args>( args ) ... );
            }
            
            template< typename T, typename... Args>
            MemoryPtr<T> CreateOne( Args&&... args )
            {
                size_t Size = sizeof( T );
            
                return MainCreate<T>( Size, std::forward<Args>( args) ... );
            }
        • IMemoryPool list์—์„œ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅํ•œ MemoryPool์„ ์ฐพ์•„์„œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์ง„ํ–‰

          • template< typename T, typenameโ€ฆ Args > MemoryPtr MainCreate( size_t Size, Args&&โ€ฆ args )

            • HasList()
              • ํ•ด๋‹น T ํƒ€์ž…์— ๋Œ€ํ•œ IMemoryPool List๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
            • CreateList()
              • ํ•ด๋‹น T ํƒ€์ž…์— ๋Œ€ํ•œ IMemoryPool List ์ƒ์„ฑ
            • GetList()
              • ํ•ด๋‹น T ํƒ€์ž…์— ๋Œ€ํ•œ IMemoryPool ํฌ์ธํ„ฐ๋ฅผ ์ง€๋‹Œ List์˜ ๋ ˆํผ๋Ÿฐ์Šค ํ˜ธ์ถœ
            • GetMemoryPool( char Start )*
              • ํ•ด๋‹น T ํƒ€์ž…์˜ Start Pointer๋ฅผ ์ง€๋‹Œ IMemoryPool Pointer ๋ฐ˜ํ™˜
            • IMemoryPool List๋ฅผ ๋์—์„œ๋ถ€ํ„ฐ ํ˜ธ์ถœํ•˜๋ฉฐ, ์ƒ์„ฑ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ
              • ์ „๋ถ€ ๋ถˆ๊ฐ€๋Šฅ
                • ์ „์ฒด์˜ IMemoryPool์ด ๊ฐ€๋“ ์ฐผ์„ ์‹œ, ์ƒˆ๋กœ์šด MemoryPool ์ƒ์„ฑ
                • MainCreate ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
              • ๊ฐ€๋Šฅ
                • MemoryPool์„ ํ˜ธ์ถœ ๋ฐ ๊ฐ์ฒด ์ƒ์„ฑ
            template< typename T, typename... Args >
            MemoryPtr<T> MainCreate( size_t Size, Args&&... args )
            {
                if ( !HasList<T>() ) CreateList<T>( Size );
            
                IMemoryPoolPtrList& PoolPtrList = GetList<T>();            
                for ( auto ITR = PoolPtrList.rbegin(); ITR != PoolPtrList.rend(); ITR++ )
                {
                    MemoryPool<T>* memoryPool = GetMemoryPool<T>( *ITR );
                    if ( memoryPool->CheckFull() ) continue;
                    else
                    {
                        MemoryPtr<T> mPtr = memoryPool->Construct( std::forward<Args>( args ) ... );
                        mPtr.SetPoolPtr( memoryPool->GetStartPtr() );
            
                        return mPtr;
                    }
                }
                
                CreateMemoryPool<T>( Size );
                return MainCreate<T>( Size, std::forward<Args>( args ) ... );
            }
      • ์‚ญ์ œ ๊ด€๋ จ

        • MemoryPtr์•ˆ์— ์žˆ๋Š” MemoryPool์˜ Start Ptr ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•˜์—ฌ์„œ ์‚ญ์ œ

          • template< typename T > void Delete( MemoryPtr& mPtr )
            • GetPoolPtr()
              • ํ•ด๋‹น MemoryPtr์˜ Ptr๊ฐ€ ์žˆ๋Š” MemoryPool์˜ Start Ptr ๋ฐ˜ํ™˜
            • HasMemoryPool( char Start )*
              • ํ•ด๋‹น T ํƒ€์ž…์—์„œ Start์˜ Start Pointer๋ฅผ ๊ฐ–๋Š” MemoryPool ํ™•์ธ
          template< typename T >
          void Delete( MemoryPtr<T>& mPtr )
          {
              if ( !HasList<T>() ) return;
          
              char* PoolPtr = mPtr.GetPoolPtr();
              bool Check = HasMemoryPool<T>( PoolPtr );
              if ( Check ) 
              {
                  MemoryPool<T>* memoryPool = GetMemoryPool<T>( PoolPtr );
                  memoryPool->Destruct( mPtr.GetPtr() );
                  
                  if ( memoryPool->CheckEmpty() ) DeletePool<T>( PoolPtr );
              }
          }

CMakelists ์„ค์ •

  • ์„ค์ • ๊ด€๋ฆฌ

    • BUILD_STATIC_LIBRARY

      • true : ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • false : ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • INSTALL_DEMO_FILE

      • true : Demofile ์„ค์น˜
      • false : Demofile ๋ฏธ์„ค์น˜
      OPTION( BUILD_STATIC_LIBRARY "Set option for the library which is static or dynamic" OFF )
      OPTION( INSTALL_DEMO_FILE "Install demofile for memorymanager" ON )
      ## Set Option for install lib, header files' path
      SET( PREFIX_DIR ${MAIN_DIR}/build/Prefix CACHE PATH "Prefix Path" )
      SET( INCLUDE_DIR ${MAIN_DIR}/build/include CACHE PATH "Header files Path" )
      SET( ARC_DIR ${MAIN_DIR}/build/arc CACHE PATH "Archieve files Path" )
      SET( LIB_DIR ${MAIN_DIR}/build/lib CACHE PATH "Library files Path" )
      SET( BIN_DIR ${MAIN_DIR}/build/bin CACHE PATH "Execute files Path" )
      SET( CMAKE_BUILD_TYPE Debug CACHE STRING "Build Type" )
  • ์—ฐ๊ฒฐ ๊ด€๋ฆฌ

    • Log Project

      #### Log ----------------------------------- #
      MESSAGE( STATUS "Log Project - Linking ... ")
      
      EXTERNALPROJECT_ADD(
      	LogProject
      	GIT_REPOSITORY GIT_REPOSITORY https://github.com/Winteradio/Log.git
      	GIT_TAG "v2.2.0"
      
      	PREFIX ${PREFIX_DIR}/LogProject
      
      	UPDATE_COMMAND "" PATCH_COMMAND "" TEST_COMMAND "" INSTALL_COMMAND ""
      	CMAKE_ARGS 
      		-DINCLUDE_DIR=${INCLUDE_DIR}
      		-DLIB_DIR=${LIB_DIR}
      		-DBIN_DIR=${BIN_DIR}
      		-DARC_DIR=${ARC_DIR}
      		-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
      		-DBUILD_STATIC_LIBRARY=${BUILD_STATIC_LIBRARY}
       		-DINSTALL_DEMO_FILE=OFF 
      )
      LIST( APPEND DEP_INCLUDE ${INCLUDE_DIR} )
      LIST( APPEND DEP_LIST LogProject )
      LIST( APPEND DEP_LIBS ${ARC_DIR}/LogProject.${STATIC_LIB} )
      
      MESSAGE( STATUS "Log Project - Done")
      #### Log ----------------------------------- #
    • Memory Project

      #### Memory Pool ----------------------------------- #
      MESSAGE(STATUS "Memory Project - Linking ...")
      
      EXTERNALPROJECT_ADD(
          MemoryProject
          GIT_REPOSITORY GIT_REPOSITORY https://github.com/Winteradio/MemoryPool.git
          GIT_TAG "v4.2.0"
      
          PREFIX ${PREFIX_DIR}/MemoryProject
      
          UPDATE_COMMAND "" PATCH_COMMAND "" TEST_COMMAND "" INSTALL_COMMAND ""
          CMAKE_ARGS
              -DPREFIX_DIR=${PREFIX_DIR}
              -DINCLUDE_DIR=${INCLUDE_DIR}
              -DLIB_DIR=${LIB_DIR}
              -DBIN_DIR=${BIN_DIR}
              -DARC_DIR=${ARC_DIR}
              -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
              -DBUILD_STATIC_LIBRARY=${BUILD_STATIC_LIBRARY}
              -DINSTALL_DEMO_FILE=${INSTALL_DEMO_FILE}
              -DINSTALL_MEMORY_MANAGER=ON
      )
      
      LIST( APPEND DEP_INCLUDE ${INCLUDE_DIR} )
      LIST( APPEND DEP_LIST MemoryProject )
      LIST( APPEND DEP_LIBS ${ARC_DIR}/MemoryProject.${STATIC_LIB} )
      LIST( APPEND DEP_LIBS ${ARC_DIR}/LogProject.${STATIC_LIB} )
      
      MESSAGE(STATUS "Memory Project - Done")
      #### MemoryPool ----------------------------------- #

๐Ÿ’ป Memory Project ์˜ˆ์‹œ ์ฝ”๋“œ

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐ ์†Œ๋ฉธ

  • ์‹คํ–‰ ์ฝ”๋“œ

    void Example()
    {
        MemoryManager::GetHandle().Init();
        MemoryManager::GetHandle().SetDefaultSize( 32 );
    
        MemoryPtr<Object> Value = MemoryManager::GetHandle().Create<Object>( 10 );
        MemoryManager::GetHandle().Delete<Object>( Value );
    
        MemoryManager::GetHandle().Destroy();
    }
  • ๊ฒฐ๊ณผ ์ฝ˜์†”

    17:59:40:528 | INFO  OS | Windows
    17:59:40:528 | WARN  MemoryManager | struct Object | There isn't existed this type of MemoryPool
    17:59:40:528 | INFO  MemoryManager | struct Object | Create new pool ptr list
    17:59:40:528 | INFO  MemoryManager | struct Object | Pool Ptr 000001D709C9CD00 - Start Ptr 000001D709CA7400 | Create new memory pool
    **17:59:40:528 | INFO  Instance | struct Object | 000001D709CA7400 | Create new
    17:59:40:528 | INFO  Instance | struct Object | 000001D709CA7400 | Delete**

์ž˜๋ชป๋œ ์บ์ŠคํŒ…

  • ์‹คํ–‰ ์ฝ”๋“œ

    struct IObject
    {
        public :
            IObject( int Value ) : m_Value( Value ) {};
            virtual ~IObject() {};
    
            virtual void Action() { Log::Info("IObject"); }
    
        public :
            int m_Value;
    };
    
    struct Object : public IObject
    {
        public :
            Object( int Value ) : IObject( Value ) {};
            Object() : IObject( 0 ) {};
            virtual ~Object() {};
    
            virtual void Action() { Log::Info("Object"); }
    };
    
    void Example()
    {
        MemoryManager::GetHandle().Init();
        MemoryManager::GetHandle().SetDefaultSize( 32 );
    
        MemoryPtr<IObject> IOValue = MemoryManager::GetHandle().Create<IObject>( 10 );
        MemoryPtr<Object> OValue = IOValue;
    
        MemoryManager::GetHandle().Destroy();
    }
  • ๊ฒฐ๊ณผ ์ฝ˜์†”

    18:01:32:826 | INFO  OS | Windows
    18:01:32:826 | WARN  MemoryManager | struct IObject | There isn't existed this type of MemoryPool
    18:01:32:826 | INFO  MemoryManager | struct IObject | Create new pool ptr list
    18:01:32:826 | INFO  MemoryManager | struct IObject | Pool Ptr 000001F8DB371AE0 - Start Ptr 000001F8DB377140 | Create new memory pool
    18:01:32:826 | INFO  Instance | struct IObject | 000001F8DB377140 | Create new
    **18:01:32:826 | WARN  MPTR | MemoryPtr<struct Object>::CheckValidityofCopy | struct Object | No inheritance relationship with struct IObject
    18:01:32:826 | ERROR  MPTR | MemoryPtr<struct Object>::operator = | struct Object | Copying this MPtr is invalid**

์ฃผ์–ด์ง„ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ชป ์ฐพ๊ฒ ์–ด

  • ์‹คํ–‰ ์ฝ”๋“œ

    void Example()
    {
        MemoryManager::GetHandle().Init();
        MemoryManager::GetHandle().SetDefaultSize( 32 );
    
        MemoryManager::GetHandle().Create<Object>( 11 );
        
        MemoryPtr<Object> OValue = new Object( 10 );
        MemoryManager::GetHandle().Delete<Object>( OValue );
    
        MemoryManager::GetHandle().Destroy();
    }
  • ๊ฒฐ๊ณผ ์ฝ˜์†”

    18:04:08:086 | INFO  OS | Windows
    18:04:08:086 | WARN  MemoryManager | struct Object | There isn't existed this type of MemoryPool
    18:04:08:086 | INFO  MemoryManager | struct Object | Create new pool ptr list
    18:04:08:086 | INFO  MemoryManager | struct Object | Pool Ptr 000001D44E6B0EA0 - Start Ptr 000001D44E6B5410 | Create new memory pool
    18:04:08:086 | INFO  Instance | struct Object | 000001D44E6B5410 | Create new
    **18:04:08:086 | WARN  MemoryManager | struct Object | There is no memory pool CCCCCCCCCCCCCCCC**
    18:04:08:086 | INFO  MemoryManager | Pool Ptr 000001D44E6B0EA0 - Start Ptr 000001D44E6B5410 | Destroy memory pool
    18:04:08:086 | INFO  Instance | struct Object | 000001D44E6B5410 | Delete
    • MemoryManager๋ฅผ ํ†ตํ•ด์„œ ์ƒ์„ฑ๋œ MemoryPtr์ด ์•„๋‹Œ ๊ฒฝ์šฐ, Destruct ๋ถˆ๊ฐ€

๐Ÿ’ก ์„ฑ์žฅ ๊ฒฝํ—˜

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ค‘์š”์„ฑ

  • Log Project์™€ Memory Project๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ฒ ๋‹ค.
  • ๋‚˜๋ˆ„์–ด์„œ ๊ด€๋ฆฌํ•˜๋‹ค๋ณด๋”” ๋”์šฑ ํŽธ๋ฆฌํ•˜์˜€๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ฒ„์ ผ๋งŒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ธฐ์กด์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹จ์ˆœ ๋ฒ„์ ผ์„ ์˜ฌ๋ ค์ฃผ๊ฑฐ๋‚˜ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋งŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์—๋„ ํฌ๊ฒŒ ๋ฌด๋ฆฌ๊ฐ€ ์—†์—ˆ๋‹ค.
  • ๋ฌผ๋ก  ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ 180๋„ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค์˜ ์ˆ˜์ •๋„ ํ•„์š”ํ•˜๊ฒ ์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ํ™•์žฅํ•  ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†์—ˆ๋‹ค.
  • ๋˜ํ•œ, ์ •์ , ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋นŒ๋“œํ•˜๋ฉฐ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ๊ธฐ์กด์˜ ์†Œ์ŠคํŒŒ์ผ๋“ค์„ ์ „์ฒด ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ํŽธ๋ฆฌํ•˜์˜€๋‹ค.
  • Github์˜ Repository๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •๋“ค์„ ๋„ฃ์Œ์œผ๋กœ์จ, ๋‹จ์ˆœํžˆ ๋‚ด ํ”„๋กœ์ ํŠธ๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฅธ ์˜คํ”ˆ ์†Œ์Šค๋“ค์„ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด์„œ๋„ ์‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๊ฒฝํ—˜์ด์—ˆ๋‹ค.

๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ณด๋‹ค ๊นŠ์€ ์ดํ•ด

  • MemoryManager์™€ IMemoryPool์„ ๋งŒ๋“ค๋ฉด์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ค‘์š”์„ฑ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. template์˜ ๊ฒฝ์šฐ์—๋Š” virtual ํ•จ์ˆ˜๋กœ ์„ค์ •ํ•  ์ˆ˜๊ฐ€ ์—†๊ธฐ์—, ํ•ด๋‹น ๋ถ€๋ถ„์€ ๊ตฌ์ฒดํ™” ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„์„ ํ•˜๊ณ , ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค์€ ํฌ๊ด„์ ์ธ ๊ธฐ๋Šฅ๋“ค์€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋„ฃ์–ด์„œ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.
  • MemoryPtr ๋‚ด์—์„œ์˜ dynamic_cast๋ฅผ ํ†ตํ•ด์„œ RTTI์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Parent ์ธ์Šคํ„ด์Šค๊ฐ€ ํ• ๋‹น๋˜๊ณ  ๊ทธ๊ฒƒ์„ Parent๋ฅผ ์ƒ์†๋ฐ›๋Š” Child๋กœ ์บ์ŠคํŒ…ํ•  ๊ฒฝ์šฐ, ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” Child์— ๋Œ€ํ•œ v-table์„ ์ง€๋‹ˆ๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์œ ํšจํ•˜์ง€ ์•Š์€ ์บ์ŠคํŒ…์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ dynamic_cast์˜ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ nullptr์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • MemoryManager์—์„  Create ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ MemoryPtr์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ์ž„์‹œ๊ฐ์ฒด์˜ ๊ฐœ๋…์„ ๋ฐฐ์šฐ๊ณ  ๋‚œ ๋’ค์—๋Š” ๊ทธ๋Ÿฌํ•œ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์—ฐ์‚ฐ๋Ÿ‰์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์ด๋™์ƒ์„ฑ์ž์™€ ์ด๋™ ๋ณต์‚ฌ ๋Œ€์ž…์ž๋ฅผ MemoryPtr์— ๋„ฃ์–ด์„œ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ƒ์„ฑ์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

About

MemoryPool for ECS

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published