smallobj.h
来自「C++封装的视频采集代码」· C头文件 代码 · 共 184 行
H
184 行
////////////////////////////////////////////////////////////////////////////////// The Loki Library// Copyright (c) 2001 by Andrei Alexandrescu// This code accompanies the book:// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design // Patterns Applied". Copyright (c) 2001. Addison-Wesley.// Permission to use, copy, modify, distribute and sell this software for any // purpose is hereby granted without fee, provided that the above copyright // notice appear in all copies and that both that copyright notice and this // permission notice appear in supporting documentation.// The author or Addison-Wesley Longman make no representations about the // suitability of this software for any purpose. It is provided "as is" // without express or implied warranty.////////////////////////////////////////////////////////////////////////////////// Last update: August 9, 2002#ifndef SMALLOBJ_INC_#define SMALLOBJ_INC_#include "Threads.h"#include "Singleton.h"#include <cstddef>#include <vector>//#pragma warning(disable: 111 444 981)#ifndef DEFAULT_CHUNK_SIZE#define DEFAULT_CHUNK_SIZE 4096#endif#ifndef MAX_SMALL_OBJECT_SIZE#define MAX_SMALL_OBJECT_SIZE 64#endifnamespace Loki{////////////////////////////////////////////////////////////////////////////////// class FixedAllocator// Offers services for allocating fixed-sized objects//////////////////////////////////////////////////////////////////////////////// class FixedAllocator { private: struct Chunk { void Init(std::size_t blockSize, unsigned char blocks); void* Allocate(std::size_t blockSize); void Deallocate(void* p, std::size_t blockSize); void Reset(std::size_t blockSize, unsigned char blocks); void Release(); unsigned char* pData_; unsigned char firstAvailableBlock_, blocksAvailable_; }; // Internal functions void DoDeallocate(void* p); Chunk* VicinityFind(void* p); // Data std::size_t blockSize_; unsigned char numBlocks_; typedef std::vector<Chunk> Chunks; Chunks chunks_; Chunk* allocChunk_; Chunk* deallocChunk_; // For ensuring proper copy semantics mutable const FixedAllocator* prev_; mutable const FixedAllocator* next_; public: // Create a FixedAllocator able to manage blocks of 'blockSize' size explicit FixedAllocator(std::size_t blockSize = 0); FixedAllocator(const FixedAllocator&); FixedAllocator& operator=(const FixedAllocator&); ~FixedAllocator(); void Swap(FixedAllocator& rhs); // Allocate a memory block void* Allocate(); // Deallocate a memory block previously allocated with Allocate() // (if that's not the case, the behavior is undefined) void Deallocate(void* p); // Returns the block size with which the FixedAllocator was initialized std::size_t BlockSize() const { return blockSize_; } // Comparison operator for sorting bool operator<(std::size_t rhs) const { return BlockSize() < rhs; } }; ////////////////////////////////////////////////////////////////////////////////// class SmallObjAllocator// Offers services for allocating small-sized objects//////////////////////////////////////////////////////////////////////////////// class SmallObjAllocator { public: SmallObjAllocator( std::size_t chunkSize, std::size_t maxObjectSize); void* Allocate(std::size_t numBytes); void Deallocate(void* p, std::size_t size); private: SmallObjAllocator(const SmallObjAllocator&); SmallObjAllocator& operator=(const SmallObjAllocator&); typedef std::vector<FixedAllocator> Pool; Pool pool_; FixedAllocator* pLastAlloc_; FixedAllocator* pLastDealloc_; std::size_t chunkSize_; std::size_t maxObjectSize_; };////////////////////////////////////////////////////////////////////////////////// class SmallObject// Base class for polymorphic small objects, offers fast// allocations/deallocations//////////////////////////////////////////////////////////////////////////////// template < template <class> class ThreadingModel = DEFAULT_THREADING, std::size_t chunkSize = DEFAULT_CHUNK_SIZE, std::size_t maxSmallObjectSize = MAX_SMALL_OBJECT_SIZE > class SmallObject : public ThreadingModel< SmallObject<ThreadingModel, chunkSize, maxSmallObjectSize> > { typedef ThreadingModel< SmallObject<ThreadingModel, chunkSize, maxSmallObjectSize> > MyThreadingModel; struct MySmallObjAllocator : public SmallObjAllocator { MySmallObjAllocator() : SmallObjAllocator(chunkSize, maxSmallObjectSize) {} }; // The typedef below would make things much simpler, // but MWCW won't like it // typedef SingletonHolder<MySmallObjAllocator/*, CreateStatic, // DefaultLifetime, ThreadingModel*/> MyAllocator; public: static void* operator new(std::size_t size) {#if (MAX_SMALL_OBJECT_SIZE != 0) && (DEFAULT_CHUNK_SIZE != 0) typename MyThreadingModel::Lock lock; (void)lock; // get rid of warning return SingletonHolder<MySmallObjAllocator, CreateStatic, PhoenixSingleton>::Instance().Allocate(size);#else return ::operator new(size);#endif } static void operator delete(void* p, std::size_t size) {#if (MAX_SMALL_OBJECT_SIZE != 0) && (DEFAULT_CHUNK_SIZE != 0) typename MyThreadingModel::Lock lock; (void)lock; // get rid of warning SingletonHolder<MySmallObjAllocator, CreateStatic, PhoenixSingleton>::Instance().Deallocate(p, size);#else ::operator delete(p); //### BCB doesn't like size parameter#endif } virtual ~SmallObject() {} };} // namespace Loki////////////////////////////////////////////////////////////////////////////////// Change log:// June 20, 2001: ported by Nick Thurn to gcc 2.95.3. Kudos, Nick!!!// July 16, 2002: Ported by Terje Sletteb
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?