fast_alloc.hh
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 217 行
HH
217 行
/* * Copyright (c) 2000, 2001, 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Steven K. Reinhardt *//* * This code was originally written by Steve Reinhardt as part of * the Wisconsin Wind Tunnel simulator. Relicensed as part of M5 * by permission. */#ifndef __FAST_ALLOC_H__#define __FAST_ALLOC_H__#include <stddef.h>// Fast structure allocator. Designed for small objects that are// frequently allocated and deallocated. This code is derived from the// 'alloc_struct' package used in WWT and Blizzard. C++ provides a// much nicer framework for the same optimization. The package is// implemented as a class, FastAlloc. Allocation and deletion are// performed using FastAlloc's new and delete operators. Any object// that derives from the FastAlloc class will transparently use this// allocation package.// The static allocate() and deallocate() methods can also be called// directly if desired.// In order for derived classes to call delete with the correct// structure size even when they are deallocated via a base-type// pointer, they must have a virtual destructor. It is sufficient for// FastAlloc to declare a virtual destructor (as it does); it is not// required for derived classes to declare their own destructor. The// compiler will automatically generate a virtual destructor for each// derived class. However, it is more efficient if each derived class// defines an inline destructor, so that the compiler can statically// collapse the destructor call chain back up the inheritance// hierarchy.// Uncomment this #define to track in-use objects// (for debugging memory leaks).//#define FAST_ALLOC_DEBUG// Uncomment this #define to count news, deletes, and chunk allocations// (by bucket).// #define FAST_ALLOC_STATS#include "config/no_fast_alloc.hh"#if NO_FAST_ALLOCclass FastAlloc {};#elseclass FastAlloc { public: static void *allocate(size_t); static void deallocate(void *, size_t); void *operator new(size_t); void operator delete(void *, size_t);#ifdef FAST_ALLOC_DEBUG FastAlloc(); FastAlloc(FastAlloc*,FastAlloc*); // for inUseHead, see below virtual ~FastAlloc();#else virtual ~FastAlloc() {}#endif private: // Max_Alloc_Size is the largest object that can be allocated with // this class. There's no fundamental limit, but this limits the // size of the freeLists array. Let's not make this really huge // like in Blizzard. static const int Max_Alloc_Size = 512; // Alloc_Quantum is the difference in size between adjacent // buckets in the free list array. static const int Log2_Alloc_Quantum = 3; static const int Alloc_Quantum = (1 << Log2_Alloc_Quantum); // Num_Buckets = bucketFor(Max_Alloc_Size) + 1 static const int Num_Buckets = ((Max_Alloc_Size + Alloc_Quantum - 1) >> Log2_Alloc_Quantum) + 1; // when we call new() for more structures, how many should we get? static const int Num_Structs_Per_New = 20; static int bucketFor(size_t); static void *moreStructs(int bucket); static void *freeLists[Num_Buckets];#ifdef FAST_ALLOC_STATS static unsigned newCount[Num_Buckets]; static unsigned deleteCount[Num_Buckets]; static unsigned allocCount[Num_Buckets];#endif#ifdef FAST_ALLOC_DEBUG // per-object debugging fields bool inUse; // in-use flag FastAlloc *inUsePrev; // ptrs to build list of in-use objects FastAlloc *inUseNext; // static (global) debugging vars static int numInUse; // count in-use objects static FastAlloc inUseHead; // dummy head for list of in-use objects public: // functions to dump debugging info (see fast_alloc.cc for C // versions that might be more agreeable to call from gdb) static void dump_summary(); static void dump_oldest(int n);#endif};inlineint FastAlloc::bucketFor(size_t sz){ return (sz + Alloc_Quantum - 1) >> Log2_Alloc_Quantum;}inlinevoid *FastAlloc::allocate(size_t sz){ int b; void *p; if (sz > Max_Alloc_Size) return (void *)::new char[sz]; b = bucketFor(sz); p = freeLists[b]; if (p) freeLists[b] = *(void **)p; else p = moreStructs(b);#ifdef FAST_ALLOC_STATS ++newCount[b];#endif return p;}inlinevoid FastAlloc::deallocate(void *p, size_t sz){ int b; if (sz > Max_Alloc_Size) { ::delete [] (char *)p; return; } b = bucketFor(sz); *(void **)p = freeLists[b]; freeLists[b] = p;#ifdef FAST_ALLOC_STATS ++deleteCount[b];#endif}inlinevoid *FastAlloc::operator new(size_t sz){ return allocate(sz);}inlinevoid FastAlloc::operator delete(void *p, size_t sz){ deallocate(p, sz);}#endif // NO_FAST_ALLOC#endif // __FAST_ALLOC_H__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?