c++内存池概要1.doc

c内存池概要1

C++?内存池 ???下载示例工程?– 105Kb ???下载源代码?– 17.3Kb 目录 ??引言 ??它怎样工作 ??示例 ??使用这些代码 ??好处 ??关于代码 ??ToDo ??历史 ? 引言 C/C++的内存分配(通过malloc或new)可能需要花费很多时。 更糟糕的是,随着时间的流逝,内存(memory)将形成碎片,所以一个应用程序的运行会越来越慢当它运行了很长时间和/或执行了很多的内存分配(释放)操作的时候。特别是,你经常申请很小的一块内存,堆(heap)会变成碎片的。 解决方案:你自己的内存池 一个(可能的)解决方法是内存池(Memory Pool)。 在启动的时候,一个”内存池”(Memory Pool)分配一块很大的内存,并将会将这个大块(block)分成较小的块(smaller chunks)。每次你从内存池申请内存空间时,它会从先前已经分配的块(chunks)中得到,而不是从操作系统。最大的优势在于: ??非常少(几没有)?堆碎片 ??比通常的内存申请/释放(比如通过malloc,?new等)的方式快 另外,你可以得到以下好处: ??检查任何一个指针是否在内存池里 ??写一个”堆转储(Heap-Dump)”到你的硬盘(对事后的调试非常有用) ??某种”内存泄漏检测(memory-leak detection)”:当你没有释放所有以前分配的内存时,内存池(Memory Pool)会抛出一个断言(assertion). 它怎样工作 让我们看一看内存池(Memory Pool)的UML模式图: 这个模式图只显示了类CMemoryPool的一小部分,参看由Doxygen生成的文档以得到详细的类描述。 ? 一个关于内存块(MemoryChunks)的单词 你应该从模式图中看到,内存池(Memory Pool)管理了一个指向结构体SMemoryChunk?(m_ptrFirstChunk,?m_ptrLastChunk, and?m_ptrCursorChunk)的指针。这些块(chunks)建立一个内存块(memory chunks)的链表。各自指向链表中的下一个块(chunk)。当从操作系统分配到一块内存时,它将完全的被SMemoryChunks管理。让我们近一点看看一个块(chunk)。 typedef?struct?SMemoryChunk { 牋TByte?Data?牋牋牋牋牋牋?/燭he燼ctual燚ata xygen生成的文档以得到牋std::size_t燚ataSize?牋牋//燬ize爋f爐he?Data-Block 详细的类描述。 牋std::size_t燯sedSize?牋牋//燼ctual爑sed燬ize -Block 详牋bool營sAllocationChunk?牋//爐rue,爓hen爐his燤emoryChunks 述。 ? 一牋牋牋牋牋牋牋牋牋牋牋牋牋牋//燩oints爐o燼?Data-Block s燤emoryChunks 述。 牋牋牋牋牋牋牋牋牋牋牋牋牋牋//爓hich燾an燽e燿eallocated爒ia?free() ks 述。 ? 一个关于内存块(Me牋SMemoryChunk?Next?牋牋牋//燩ointer爐o爐he燦ext燤emoryChunk 述。 ? 一个关于牋牋牋牋牋牋牋牋牋牋牋牋牋牋//爄n爐he燣ist?may燽e燦ULL) ext燤emoryChunk 述。 ? }燬memoryChunk; / 每个块(chunk)持有一个指针,指针指向: ??一小块内存(Data), ??从块(chunk)开始的可用内存的总大小(DataSize), ??实际使用的大小(UsedSize), ??以及一个指向链表中下一个块(chunk)的指针。 第一步:预申请内存(pre-allocating the memory) 当你调用CmemoryPool的构造函数,内存池(Memory Pool)将从操作系统申请它的第一块(大的)内存块(memory-chunk) /*Constructor ******************/ CMemoryPool::CMemoryPool(const爏td::size_t?sInitialMemoryPoolSize, 存池牋牋牋牋牋牋牋牋牋牋牋牋燾onst爏td::size_t?sMemoryChunkSize, ialMemoryPoolSi牋牋牋牋牋牋牋牋牋牋牋牋燾onst爏td::size_t?sMinimalMemorySizeToAllocate, lSize, 存池(Memor牋牋牋牋牋牋牋牋牋牋牋牋燽ool燽SetMemoryData) nimalMemorySiz{ 牋m_ptrFirstChunk牋=燦U

文档评论(0)

1亿VIP精品文档

相关文档