Skip to content

mrhexvel/memory-pool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MemoryPool

ΠŸΡ€ΠΎΡΡ‚Π°Ρ рСализация ΠΏΡƒΠ»Π° памяти Π½Π° C++ с использованиСм фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ свободными Π±Π»ΠΎΠΊΠ°ΠΌΠΈ.

alt text

ОписаниС

MemoryPool β€” это класс, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡƒΠ» памяти с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ выдСлСния ΠΈ освобоТдСния Π±Π»ΠΎΠΊΠΎΠ² памяти Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΈ управляСт свободными участками с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° для потокобСзопасности.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ возмоТности:

  • Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ· ΠΏΡƒΠ»Π° (allocate)
  • ОсвобоТдСниС Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти (deallocate)
  • ОбъСдинСниС смСТных свободных Π±Π»ΠΎΠΊΠΎΠ² для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ
  • ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ благодаря использованию std::mutex

Зависимости

  • Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° C++ (STL)
  • ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ C++11 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅

ИспользованиС

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°

#include <iostream>
#include "MemoryPool.h"

int main() {
    // созданиС ΠΏΡƒΠ»Π° памяти Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 1024 Π±Π°ΠΉΡ‚Π°
    MemoryPool pool(1024);

    // Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти
    void* mem1 = pool.allocate(256);
    void* mem2 = pool.allocate(128);

    // освобоТдСниС памяти
    pool.deallocate(mem1, 256);
    pool.deallocate(mem2, 128);

    std::cout << "ΠΏΠ°ΠΌΡΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π°." << std::endl;
    return 0;
}

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΈ запуск

g++ -o memory_pool main.cpp -std=c++11
./memory_pool

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΊΠΎΠ΄Π°

Класс MemoryPool

  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€: MemoryPool(std::size_t poolSize) β€” выдСляСт ΠΏΡƒΠ» памяти Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.
  • ДСструктор: ~MemoryPool() β€” освобоТдаСт Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ allocate: void* allocate(std::size_t size) β€” выдСляСт Π±Π»ΠΎΠΊ памяти Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.
  • ΠœΠ΅Ρ‚ΠΎΠ΄ deallocate: void deallocate(void* ptr, std::size_t size) β€” освобоТдаСт ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ памяти.
  • Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ consolidateFreeBlocks: ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ смСТныС свободныС Π±Π»ΠΎΠΊΠΈ для прСдотвращСния Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅

  • poolSize: Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π° памяти Π² Π±Π°ΠΉΡ‚Π°Ρ….
  • pool: ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ памяти.
  • freeBlocks: Π²Π΅ΠΊΡ‚ΠΎΡ€ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° свободныС Π±Π»ΠΎΠΊΠΈ.
  • freeBlockSizes: Π²Π΅ΠΊΡ‚ΠΎΡ€ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² свободных Π±Π»ΠΎΠΊΠΎΠ².
  • mtx: ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ для обСспСчСния потокобСзопасности.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ

  • НСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ выдСлСния памяти большС, Ρ‡Π΅ΠΌ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡƒΠ»Π°.
  • ΠŸΡ€ΠΎΡΡ‚Π°Ρ стратСгия поиска свободного Π±Π»ΠΎΠΊΠ° (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ подходящий).
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Π° фрагмСнтация ΠΏΡ€ΠΈ частом Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ/освобоТдСнии Π±Π»ΠΎΠΊΠΎΠ² Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ

  • ИспользованиС Π±ΠΎΠ»Π΅Π΅ эффСктивного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска свободного Π±Π»ΠΎΠΊΠ° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "best fit").
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ динамичСского Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΏΡƒΠ»Π°.
  • РСализация ΠΏΡƒΠ»Π° с Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ Π±Π»ΠΎΠΊΠΎΠ² для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ЛицСнзия

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ MIT. Π‘ΠΌ. Ρ„Π°ΠΉΠ» LICENSE для подробностСй (Ссли ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ).

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages