乙個簡單的C 記憶體管理與引用計數指標

2021-08-03 01:58:16 字數 4012 閱讀 7240

最近專案需要一些模式相對固定的記憶體申請和銷毀,手癢寫了個c++記憶體管理器和引用計數的智慧型指標,加入了一些多執行緒保護機制(未測試)。**見文章後半部分。

在main()裡做了乙個簡單速度測試。在我的i5 4590+8g+win7機器上,使用定製記憶體管理的程式耗時0.35秒,使用new/delete的耗時16.9秒。這個記憶體管理**還可以根據堆上記憶體的申請和銷毀模式做進一步定製。

memmanagement.h

#ifndef __memory_management_h_included__

#define __memory_management_h_included__

#include #include #include // "recreationally" created by pkathlon, 2017/06/25

// feel free to use, modify, and restructure it

namespace customized_memorymanagement

fixedallocatedmem(unsigned int nblocks, unsigned int nelementsperblock)

memseginfo *pprevseg;

for (int i = 0; i < nblocks; ++i)

else

pprevseg = newinfo;}}

~fixedallocatedmem()

}t* allocatemem(unsigned int nelements)

memseginfo *pprevseg = nullptr;

for (memseginfo *pmsi = m_psegheader; pmsi; pprevseg = pmsi, pmsi = pmsi->_pnext)

if (pmsi->_sz > nelements)

pmsi->_state |= 0x02;

return pmsi->_ptr;

}memseginfo *newinfo = new memseginfo;

newinfo->_ptr = new t[nelements];

newinfo->_sz = nelements;

newinfo->_state = 0x03;

newinfo->_pnext = nullptr;

pprevseg->_pnext = newinfo;

return newinfo->_ptr;

}bool returnmem(t *memptr) */

pmsi->_state &= 0xffffffd;

memseginfo *pmergedptr = pmsi;

if ((pprevseg != nullptr) && (pprevseg->_state & 0x02) == 0 && (pmsi->_state & 0x01) == 0)

if (pmsi->_pnext != nullptr && pmsi->_pnext->_state == 0)

if (pmergedptr != pmsi)

return true;}}

return false; // incorrect memptr

}void releasemem()

while (m_psegheader->_state == 0x01)

}else

}memseginfo *pprevseg = m_psegheader;

for (memseginfo *pcurseg = m_psegheader->_pnext; pcurseg;

pprevseg = pcurseg, pcurseg = pcurseg->_pnext)

if (pcurseg->_pnext == nullptr

|| (pcurseg->_pnext->_state & 0x01)) }}

void _displaychainedmemorysegments() const

int cnt = 0;

for (memseginfo *pseg = m_psegheader; pseg != nullptr; pseg = pseg->_pnext, ++cnt)

}protected:

struct memseginfo ; // memory blocks are recorded in linked chains

memseginfo *m_psegheader;

std::mutex m_mutex;

};template class mempointer

mempointer(t *pmemwewillnotrelease)

mempointer(mempointer &orimp)

else

}mempointer(unsigned int nelementsize)

mempointer& operator= (mempointer &orimp)

else

if (this->m_prefinfo && this->m_prefinfo->_bresponsible)

}this->m_prefinfo = dstrefstruct;

return (*this);

}mempointer& operator= (t *pmemwewillnotrelease)

}m_prefinfo = g_refs_memmgt.allocatemem(1);

m_prefinfo->_bresponsible = false;

m_prefinfo->_pdata = pmemwewillnotrelease;

return (*this);

}~mempointer()

}else }}

t& operator (int index)

else if (m_prefinfo->_bresponsible && (index < 0 || index >= (int)m_prefinfo->_size))

return (m_prefinfo->_pdata)[index];

}unsigned int size() const

else if (!m_prefinfo->_bresponsible)

else

}protected:

struct refstruct ;

refstruct *m_prefinfo;

static fixedallocatedmemg_data_memmgt;

static fixedallocatedmemg_refs_memmgt;

};template fixedallocatedmemmempointer::g_data_memmgt;

template fixedallocatedmem::refstruct> mempointer::g_refs_memmgt;

}#endif

main.cpp

#include #include "memmanagement.h"

int main()

#else

for (int i = 0; i < 1000000; ++i)

#endif

std::chrono::system_clock::time_point t1 = std::chrono::high_resolution_clock::now();

double timediff = std::chrono::duration_cast(t1 - t0).count() / (1e6);

std::cout << "elapsed time = " << timediff << " milliseconds...\n";

getchar();

return 0;

}

引用計數器 與 記憶體管理

一 引用計數器的基本操作 1.方法的基本使用 1 retain 計數器 1,會返回物件本身 2 release 計數器 1,沒有返回值 3 retaincount 獲取當前的計數器的值 4 dealloc 當乙個person物件被 的時候,就會自動呼叫這個方法 void dealloc 2.概念 1...

swift記憶體管理中的引用計數

在swift中,每乙個物件都有生命週期,當生命週期結束會呼叫deinit 函式進行釋放記憶體空間。觀察這一段 class person init name string,petname string deinit class pet deinit 這段 建立了兩個類,分別是person類和pet類,...

swift記憶體管理中的引用計數

在swift中,每乙個物件都有生命週期,當生命週期結束會呼叫deinit 函式進行釋放記憶體空間。觀察這一段 class person init name string,petname string deinit class pet deinit 這段 建立了兩個類,分別是person類和pet類,...