簡明分析C/C++記憶體配置的解決方案

來源:互聯網
上載者:User

C/C++的記憶體配置(通過malloc或new)可能需要花費很多時。

更糟糕的是,隨 著時間的流逝,記憶體(memory)將形成片段,所以一個應用程式的運行會越來越慢。當它 運行了很長時間和/或執行了很多的記憶體配置(釋放)操作的時候。特別是,你經常申請 很小的一塊記憶體,堆(heap)會變成片段的。

解決方案:你自己的記憶體池一個( 可能的)解決方案是記憶體池(Memory Pool)。

在啟動的時候,一個“記憶體 池”(Memory Pool)分配一塊很大的記憶體,並將會將這個大塊(block)分成較小 的塊(smaller chunks)。每次你從記憶體池申請記憶體空間時,它會從先前已經分配的塊( chunks)中得到,而不是從作業系統。最大的優勢在於:

1:非常少(幾沒有) 堆片段

2: 比通常的記憶體申請/釋放(比如通過malloc, new等)的方式快另外, 你可以得到以下好處:1:檢查任何一個指標是否在記憶體池裡2:寫一個“堆轉儲 (Heap-Dump)”到你的硬碟(對事後的調試非常有用)

3: 某種“內 存泄漏檢測(memory-leak detection)”:當你沒有釋放所有以前分配的記憶體時, 記憶體池(Memory Pool)會拋出一個斷言(assertion)。

SMemoryChunk.h

#ifndef __SMEMORYCHUNK_H__
#define __SMEMORYCHUNK_H__
typedef unsigned char TByte ;
struct SMemoryChunk
{
 TByte *Data;         //資料
  std::size_t DataSize;    //該記憶體塊的總大小
 std::size_t UsedSize;     //實際使用的大小
 bool IsAllocationChunk;
 SMemoryChunk *Next;     //指向鏈表中下一個塊的指標。
};
#endif

IMemoryBlock.h

#ifndef __IMEMORYBLOCK_H__
#define __IMEMORYBLOCK_H__
class IMemoryBlock
{
 public :
  virtual ~IMemoryBlock() {};
  virtual void *GetMemory(const std::size_t &sMemorySize) = 0;
  virtual void FreeMemory(void *ptrMemoryBlock, const std::size_t &sMemoryBlockSize) = 0;
};
#endif

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.