1ã€ã®ããããŒ.hãã¡ã€ã«ã§ã®ãã¹ãŠã®å®è£ ïŒ[fast_mem_pool.h]
ãããããªããã®ã¢ãã±ãŒã¿ãŒãäœçŸãã®åæ§ã®ã¢ãã±ãŒã¿ãŒãããåªããŠããã®ã-ã«ããã®äžã§ã
ãããç§ã®ãã€ã¯ã®ä»çµã¿ã§ãã
1ïŒãªãªãŒã¹ãã«ãã§ã¯ããã¥ãŒããã¯ã¹ãã¢ãããã¯ã®åŸ æ©ãµã€ã¯ã«ã¯ãããŸããããã¢ãã±ãŒã¿ãŒã¯åŸªç°çã§ãããã¹ã¬ããã«ãã£ãŠãªãªãŒã¹ããããšãã«ãªãœãŒã¹ãç¶ç¶çã«åçæããŸãã圌ã¯ã©ããã£ãŠãããããŸããïŒ
FastMemPoolãfmallocãä»ããŠæäŸããRAMã®åå²ãåœãŠã¯ãå®éã«ã¯ããããŒçšã§ãã
struct AllocHeader {
// : tag_this = this + leaf_id
uint64_t tag_this { 2020071700 };
// :
int size;
// :
int leaf_id { -2020071708 };
};
ãã®ããããŒã¯ããã€ã³ã¿ãŒïŒres_ptrïŒããå·»ãæ»ãããšã«ããããŠãŒã¶ãŒãææãããã€ã³ã¿ãŒããåžžã«ååŸã§ããŸããsizeofïŒAllocHeaderïŒïŒ
AllocHeaderããããŒã®å 容ã«ãããffreeïŒvoid * ptrïŒã¡ãœããã¯ãã®å²ãåœãŠãèªèãã埪ç°ãããã¡ãŒã¡ã¢ãªã®ã©ã®ã·ãŒããè¿ãããããæ€åºããŸãã ïŒ
void ffree(void *ptr)
{
char *to_free = static_cast<char *>(ptr)
- sizeof(AllocHeader);
AllocHeader *head = reinterpret_cast<AllocHeader *>(to_free);
ã¢ãã±ãŒã¿ãã¡ã¢ãªãå²ãåœãŠãããã«æ±ãããããšãã·ãŒãã®é åã®çŸåšã®ã·ãŒãã調ã¹ãŠãå¿ èŠãªãµã€ãº+ããããŒãµã€ãºã®ãµã€ãºïŒAllocHeaderïŒãåãåãããšãã§ãããã©ããã確èªããŸãã
ã¢ãã±ãŒã¿ã§ã¯ãLeaf_Cntã¡ã¢ãªã·ãŒããäºåã«äºçŽãããŠãããåã·ãŒãã®ãµã€ãºã¯Leaf_Size_Bytesã§ãïŒããã§ã¯ãã¹ãŠãåŸæ¥åã§ãïŒãå²ãåœãŠã®æ©äŒãæ¢ãããã«ãfmallocïŒstd :: size_t layout_sizeïŒã¡ãœããã¯leaf_arrayé åã®ãªãŒããäžåšãããã¹ãŠãããžãŒç¶æ ã®å ŽåãDo_OS_mallocãã©ã°ãæå¹ã«ãªã£ãŠãããšããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããsizeofïŒAllocHeaderïŒã§å¿ èŠãªãµã€ãºããã倧ããã¡ã¢ãªãååŸããŸã-å€éšã¡ã¢ãªã¯å éšåŸªç°ãããã¡ãŸãã¯OSããååŸãããã¢ãã±ãŒã¿ã¯åžžã«ãµãŒãã¹æ å ±ãå«ãããããŒãäœæããŸããã¢ãã±ãŒã¿ã®ã¡ã¢ãªãäžè¶³ããDo_OS_malloc == falseãã©ã°ãèšå®ãããŠããå Žåãfmallocã¯nullptrãè¿ããŸãããã®åäœã¯è² è·ãå¶åŸ¡ããã®ã«åœ¹ç«ã¡ãŸãïŒããšãã°ããã¬ãŒã åŠçã¢ãžã¥ãŒã«ãã«ã¡ã©ã®FPSã«è¿œãã€ããŠããªãå Žåããããªã«ã¡ã©ãããã¬ãŒã ãã¹ãããããŸãïŒã
ãµã€ã¯ãªã³ã°ã®å®è£ æ¹æ³
埪ç°ã¢ãã±ãŒã¿ã¯åŸªç°ã¿ã¹ã¯çšã«èšèšãããŠããŸã-ã¿ã¹ã¯ã¯æ°žé ã«ç¶ãã¹ãã§ã¯ãããŸãããããšãã°ã次ã®ããã«ãªããŸãã
- ãŠãŒã¶ãŒã»ãã·ã§ã³ã®å²ãåœãŠ
- ãããªåæã®ããã®ãããªã¹ããªãŒã ãã¬ãŒã åŠç
- ã²ãŒã å ã®æŠéãŠãããã®å¯¿åœ
leaf_arrayé åã«ã¯ä»»æã®æ°ã®ã¡ã¢ãªã·ãŒããååšããå¯èœæ§ããããããå¶éå ã§ã²ãŒã å ã®çè«çã«å¯èœãªæŠéãŠãããæ°ã®ããŒãžãäœæã§ããŸããããã«ããããŠããããè±èœããç¶æ ã§ã空ãã¡ã¢ãªã·ãŒãã確å®ã«ååŸã§ããŸããå®éã«ã¯ããããªåæã®å Žåãéåžžã¯16æã®å€§ããªã·ãŒãã§ååã§ããããã®ãã¡æåã®æ°æã¯ãæ€åºåšã®åæåæã«é·æã®éåšæçå²ãåœãŠã«å¯ä»ãããŸãã
ã¹ã¬ããã®å®å šæ§ã®å®è£ æ¹æ³
å²ãåœãŠã·ãŒãã®é åã¯ãã¥ãŒããã¯ã¹ãªãã§æ©èœããŸã...ãããŒã¿ç«¶åããªã©ã®ãšã©ãŒã«å¯Ÿããä¿è·ã¯æ¬¡ã®ããã«è¡ãããŸãã
char *buf;
// available == offset
std::atomic<int> available { Leaf_Size_Bytes };
// allocated ==
std::atomic<int> deallocated { 0 };
åã¡ã¢ãªã·ãŒãã«ã¯2ã€ã®ã«ãŠã³ã¿ããããŸãã
-Leaf_Size_Bytesã®ãµã€ãºã§åæåããŠäœ¿çšã§ããŸããå²ãåœãŠããšã«ããã®ã«ãŠã³ã¿ãŒã¯æžå°ããåãã«ãŠã³ã¿ãŒãã¡ã¢ãªã·ãŒãã®å é ã«å¯Ÿãããªãã»ãããšããŠæ©èœããŸã==ã¡ã¢ãªã¯ãããã¡ã®æ«å°Ÿããå²ãåœãŠãããŸãã
result_ptr = leaf_array[leaf_id].buf + available_after;
-å²ãåœãŠè§£é€ã¯{0}ãããŒãã«åæåããããã®ã·ãŒãã®å²ãåœãŠè§£é€ããšã«ïŒååŒãåŠçãããŠããã·ãŒããŸãã¯OSã®AllocHeaderããåŠç¿ããŸãïŒããªãªãŒã¹ãããããªã¥ãŒã ã«ãã£ãŠã«ãŠã³ã¿ãŒãå¢å ããŸãã
const int deallocated = leaf_array[head->leaf_id].deallocated.fetch_add(real_size, std::memory_order_acq_rel) + real_size;
ãã®ãããªã«ãŠã³ã¿ãŒïŒdeallocated ==ïŒLeaf_Size_Bytes-availableïŒïŒãäžèŽãããšããã«ãããã¯å²ãåœãŠããããã¹ãŠãè§£æŸããããªãŒããå ã®ç¶æ ã«ãªã»ããã§ããããšãæå³ããŸãããããã«åŸ®åŠãªãã€ã³ãããããŸãïŒãªãŒãããªã»ããããæ±ºå®åŸã«ã©ããªããå ã«æ»ããšã誰ããã·ãŒãããå¥ã®å°ããªã¡ã¢ãªãå²ãåœãŠãŸã...ãããé€å€ããã«ã¯ãcompare_exchange_strongãã§ãã¯ã䜿çšããŸãã
if (deallocated == (Leaf_Size_Bytes - available))
{ // ,
// , , Leaf
if (leaf_array[head->leaf_id].available
.compare_exchange_strong(available, Leaf_Size_Bytes))
{
leaf_array[head->leaf_id].deallocated -= deallocated;
}
}
ã¡ã¢ãªãŒã·ãŒãã¯ããªã»ããæã«äœ¿çšå¯èœãªã«ãŠã³ã¿ãŒã®ç¶æ ãæ±ºå®æãšåããŸãŸã§ããå Žåã«ã®ã¿ãå ã®ç¶æ ã«ãªã»ãããããŸããã¿ããŒ!!!
çŽ æŽãããããŒãã¹ã¯ãåå²ãåœãŠã®AllocHeaderããããŒã䜿çšããŠæ¬¡ã®ãã°ããã£ããã§ããããšã§ãã
- åå²ãåœãŠ
- ä»äººã®èšæ¶ã®å²ãåœãŠè§£é€
- ãããã¡ãªãŒããŒãããŒ
- ä»äººã®ã¡ã¢ãªé åãžã®ã¢ã¯ã»ã¹
2çªç®ã®æ©èœã¯ããããã®æ©äŒã«å®è£ ãããŸãã
2ïŒ Debugã³ã³ãã€ã«ã¯ãåå²ãåœãŠäžã«ä»¥åã®å²ãåœãŠè§£é€ãè¡ãããæ£ç¢ºãªæ å ±ïŒãã¡ã€ã«åãã³ãŒãè¡çªå·ãã¡ãœããåïŒãæäŸããŸããããã¯ãåºæ¬ã¡ãœããïŒfmallocdãffreedãcheck_accessd-ã¡ãœããã®ãããã°ããŒãžã§ã³ã®æåŸã«dãä»ããŠããŸãïŒã®åšãã«ãã³ã¬ãŒã¿ã®åœ¢åŒã§å®è£ ãããŸãã
/**
* @brief FFREE - free
* @param iFastMemPool - FastMemPool
* @param ptr - fmaloc
*/
#if defined(Debug)
#define FFREE(iFastMemPool, ptr) \
(iFastMemPool)->ffreed (__FILE__, __LINE__, __FUNCTION__, ptr)
#else
#define FFREE(iFastMemPool, ptr) \
(iFastMemPool)->ffree (ptr)
#endif
ããªããã»ããµãã¯ãã䜿çšãããŸãã
- __FILE __- c ++ãœãŒã¹ãã¡ã€ã«
- __LINE __- c ++ãœãŒã¹ãã¡ã€ã«ã®è¡çªå·
- __FUNCTION __-ãããçºçãã颿°ã®åå
ãã®æ å ±ã¯ãå²ãåœãŠãã€ã³ã¿ãšå²ãåœãŠæ å ±ã®éã®å¯Ÿå¿ãšããŠã¡ãã£ãšãŒã¿ã«ä¿åãããŸãã
struct AllocInfo {
// : , , :
std::string who;
// true - , false - :
bool allocated { false };
};
std::map<void *, AllocInfo> map_alloc_info;
std::mutex mut_map_alloc_info;
ãããã°ã§ã¯é床ã¯ããã»ã©éèŠã§ã¯ãªããããæšæºã®std ::ããããä¿è·ããããã«ãã¥ãŒããã¯ã¹ã䜿çšãããŸããããã³ãã¬ãŒããã©ã¡ãŒã¿ïŒbool Raise_Exeptions = DEF_Raise_ExeptionsïŒã¯ããšã©ãŒæã«äŸå€ãã¹ããŒãããã©ããã«åœ±é¿ããŸãã
ãªãªãŒã¹ãã«ãã§æå€§éã®å¿«é©ããæãå Žåã¯ãDEF_Auto_deallocateãã©ã°ãèšå®ãããšããã¹ãŠã®OS mallocå²ãåœãŠãæžã蟌ãŸãïŒãã§ã«std :: set <>ã®ãã¥ãŒããã¯ã¹ã®äžã«ãããŸãïŒãFastMemPoolãã¹ãã©ã¯ã¿ïŒå²ãåœãŠãã©ãã«ãŒãšããŠäœ¿çšïŒã§ãªãªãŒã¹ãããŸãã
3ïŒããããã¡ãªãŒããŒãããŒããªã©ã®ãšã©ãŒãåé¿ããã«ã¯ãå²ãåœãŠãããã¡ã¢ãªã®æäœãéå§ããåã«ãFastMemPool :: check_accessãã§ãã¯ã䜿çšããããšããå§ãããŸãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ãä»ã®èª°ãã®RAMã«ã¢ã¯ã»ã¹ãããšãã«ã®ã¿æå¥ãèšããŸãããcheck_access颿°ïŒãŸãã¯FCHECK_ACCESSãã¯ãïŒã¯ãAllocHeaderããããŒã«ãã£ãŠãæå®ãããå²ãåœãŠã®ãªãŒããŒã©ã³ããããã©ãããèšç®ããŸãã
/**
* @brief check_access -
* @param base_alloc_ptr - FastMemPool
* @param target_ptr -
* @param target_size - ,
* @return - true FastMemPool
*/
bool check_access(void *base_alloc_ptr, void *target_ptr, std::size_t target_size)
// :
if (FCHECK_ACCESS(fastMemPool, elem.array,
&elem.array[elem.array_size - 1], sizeof (int)))
{
elem.array[elem.array_size - 1] = rand();
}
åæå²ãåœãŠã®ãã€ã³ã¿ããããã°ããã€ã§ãããããŒãååŸã§ããŸããããããŒããå²ãåœãŠã®ãµã€ãºã確èªããã¿ãŒã²ããèŠçŽ ãåæå²ãåœãŠå ã«ãããã©ãããèšç®ããŸããçè«çã«å¯èœãªæå€§ã¢ã¯ã»ã¹æ°ã§åŠçãµã€ã¯ã«ãéå§ããåã«ãäžåºŠãã§ãã¯ããã ãã§ååã§ããå¶éå€ãå²ãåœãŠã®å¢çãçªç Žããå¯èœæ§ãéåžžã«é«ãã§ãïŒããšãã°ãèšç®ã§ã¯ãããã»ã¹ã®ç©ççæ§è³ªã«ãããäžéšã®å€æ°ã¯ç¹å®ã®ç¯å²å ã§ããæ©ãããšãã§ããªããšæ³å®ãããŠãããããå²ãåœãŠã®å¢çãç Žãããã®ãã§ãã¯ã¯è¡ããŸããïŒã
1é±éåŸã«æ®ºããŠãæ§é ã«ã©ã³ãã ãªããŒã¿ããšãã©ãæžã蟌ãäººãæ¢ãããããäžåºŠãã§ãã¯ããæ¹ãããã§ããã...
4ïŒ CMakeãä»ããŠã³ã³ãã€ã«æã«ããã©ã«ãã®ãã³ãã¬ãŒãã³ãŒããèšå®ããŸãã
CmakeLists.txtã«ã¯ãæ§æå¯èœãªãã©ã¡ãŒã¿ãŒãå«ãŸããŠããŸããæ¬¡ã«äŸã瀺ããŸãã
set(DEF_Leaf_Size_Bytes "65536" CACHE PATH "Size of each memory pool leaf")
message("DEF_Leaf_Size_Bytes: ${DEF_Leaf_Size_Bytes}")
set(DEF_Leaf_Cnt "16" CACHE PATH "Memory pool leaf count")
message("DEF_Leaf_Cnt: ${DEF_Leaf_Cnt}")
ããã«ãããQtCreatorïŒ
ãŸãã¯CMake GUIã§ãã©ã¡ãŒã¿ãç·šéããã®ãéåžžã«äŸ¿å©ã«ãªããŸãã
次ã«ãã³ã³ãã€ã«äžã«æ¬¡ã®ããã«ãã©ã¡ãŒã¿ãã³ãŒãã«æž¡ãããŸãã
set(SPEC_DEFINITIONS
${CMAKE_SYSTEM_NAME}
${CMAKE_BUILD_TYPE}
${SPEC_BUILD}
SPEC_VERSION="${Proj_VERSION}"
DEF_Leaf_Size_Bytes=${DEF_Leaf_Size_Bytes}
DEF_Leaf_Cnt=${DEF_Leaf_Cnt}
DEF_Average_Allocation=${DEF_Average_Allocation}
DEF_Need_Registry=${DEF_Need_Registry}
)
#
target_compile_definitions(${TARGET} PUBLIC ${TARGET_DEFINITIONS})
ã³ãŒãã§ã¯ãããã©ã«ãã®ãã³ãã¬ãŒãå€ããªãŒããŒã©ã€ãããŸãïŒ
#ifndef DEF_Leaf_Size_Bytes
#define DEF_Leaf_Size_Bytes 65535
#endif
template<int Leaf_Size_Bytes = DEF_Leaf_Size_Bytes,
int Leaf_Cnt = DEF_Leaf_Cnt,
int Average_Allocation = DEF_Average_Allocation,
bool Do_OS_malloc = DEF_Do_OS_malloc,
bool Need_Registry = DEF_Need_Registry,
bool Raise_Exeptions = DEF_Raise_Exeptions>
class FastMemPool
{
// ..
};
ãã®ãããCMakeãã©ã¡ãŒã¿ã®ãã§ãã¯ããã¯ã¹ããªã³/ãªãã«ããããšã§ãã¢ãã±ãŒã¿ãã³ãã¬ãŒããããŠã¹ã§å¿«é©ã«èª¿æŽã§ããŸãã
5ïŒåã.hãã¡ã€ã«å ã®STLã³ã³ãããŒã§ã¢ãã±ãŒã¿ãŒã䜿çšã§ããããã«ããããã«ãstd :: allocatorã®æ©èœã¯ãFastMemPoolAllocatorãã³ãã¬ãŒãã«éšåçã«å®è£ ãããŠããŸãã
// compile time :
std::unordered_map<int, int, std::hash<int>,
std::equal_to<int>,
FastMemPoolAllocator<std::pair<const int, int>> > umap1;
// runtime :
std::unordered_map<int, int> umap2(
1024, std::hash<int>(),
std::equal_to<int>(),
FastMemPoolAllocator<std::pair<const int, int>>());
䜿çšäŸã¯ãtest_allocator1.cppããã³test_stl_allocator2.cppã«ãããŸãã
ããšãã°ãå²ãåœãŠã«é¢ããã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã®äœæ¥ïŒ
bool test_Strategy()
{
/*
* Runtime
* ( )
*/
using MyAllocatorType = FastMemPool<333, 33>;
// instance of:
MyAllocatorType fastMemPool;
// inject instance:
FastMemPoolAllocator<std::string,
MyAllocatorType > myAllocator(&fastMemPool);
// 3 :
std::string* str = myAllocator.allocate(3);
// :
myAllocator.construct(str, "Mother ");
myAllocator.construct(str + 1, " washed ");
myAllocator.construct(str + 2, "the frame");
//-
std::cout << str[0] << str[1] << str[2];
// :
myAllocator.destroy(str);
myAllocator.destroy(str + 1);
myAllocator.destroy(str + 2);
// :
myAllocator.deallocate(str, 3);
return true;
}
6ïŒå€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ãããçš®ã®ã¢ãžã¥ãŒã«ãäœæãããã¹ãŠã培åºçã«ãã¹ãããããšããããŸããããã¯ã¹ã€ã¹ã®æèšã®ããã«æ©èœããŸããã¢ãžã¥ãŒã«ã¯Detectorã«å«ãŸããŠãããæŠéã«åå ããŸãã1æ¥ã«1åãã©ã€ãã©ãªããã³ãã«é¥ãå§ããããšããããŸãããããã¬ãŒã§ãã³ããå®è¡ããåŸããã€ã³ã¿ãŒã®ã«ãŒããã©ããŒãµã«ã®1ã€ã§ãnullptrã®ä»£ããã«ã誰ãã8ãšããæ°åããã€ã³ã¿ãŒã«æžã蟌ãã ããšãããããŸãããã®ãã€ã³ã¿ãŒã«ç§»åãããšãåœç¶ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæããŸããã
èããããåå ã®ç¯å²ãã©ã®ããã«çµã蟌ãããšãã§ããŸããïŒå®¹çè ããããªãã®æ§é ãé€å€ããããšã¯éåžžã«ç°¡åã§ã-ãããã¯RAMã«å¥ã®å ŽæïŒåŠšå®³è ãçæããªãå ŽæïŒã«ç§»åããå¿ èŠããããŸãïŒ
FastMemPoolã䜿çšããŠãããç°¡åã«è¡ãã«ã¯ã©ãããã°ããã§ããïŒããã¯éåžžã«ç°¡åã§ãïŒFastMemPoolã§ã¯ãå²ãåœãŠã¯ã¡ã¢ãªã®ããŒãžã®çµããããåã¿ç ãããšã«ãã£ãŠè¡ãããŸã-äœæ¥ã«å¿ èŠãªä»¥äžã®ã¡ã¢ãªã®ããŒãžãèŠæ±ããããšã«ãã£ãŠãã¡ã¢ãªã®ããŒãžã®å§ãŸãããã°ã®ããçæã®ãã¹ãã®å Žã®ãŸãŸã§ããããšãä¿èšŒããŸããäŸãã°ïŒ
FastMemPool<100000000, 1, 1024, true, true> bulletproof_mempool;
void *ptr = bulletproof_mempool.fmalloc(1234567);
// ..
// - c ptr
// ..
bulletproof_mempool.ffree(ptr);
æ°ããå Žæã§èª°ããããªãã®å»ºé ç©ãçæããŠãã
å Žåãããããããªãèªèº«ã§ã...ããã§ãªããã°ã峿žé€šãå®å®ããå ŽåãããŒã ã¯äžåºŠã«ããã€ãã®èŽãç©ãåãåããŸãïŒ
- ããªãã®ã¢ã«ãŽãªãºã ã¯åã³ã¹ã€ã¹ã®æèšã®ããã«æ©èœããŸã
- ãã°ã®ããã³ãŒããŒã¯ã空ã®ã¡ã¢ãªé åãå®å šã«çæã§ããããã«ãªããŸããïŒèª°ãããããæ¢ããŠããéïŒãã©ã€ãã©ãªã¯å®å®ããŠããŸãã
- çæç¯å²ãç£èŠããŠã¡ã¢ãªã倿Žããããšãã§ããŸã-ãã°ã®ãããšã³ã³ãŒãã«ãã©ãããèšå®ããŸãã
å šäœãšããŠããã®ç¹å®ã®ãã€ã¯ã®å©ç¹ã¯äœã§ããïŒ
- ( / )
- , Debug ,
- , /
- , ( nullptr), â , ( FPS , FastMemPool -).
åœç€Ÿã§ã¯ãé屿¿ã®3D圢ç¶è§£æã®ã€ã³ã¹ããŒã«ã«ã¯ããã«ãã¹ã¬ãããããªåŠçïŒ50FPSïŒãå¿ èŠã§ãããã·ãŒãã¯ã«ã¡ã©ã®äžãééããã¬ãŒã¶ãŒã®åå°ã§ã·ãŒãã®3DããããäœæããŸãã FastMemPoolã¯ãã¡ã¢ãªãšå®å šæ§ãæäœããæå€§é床ã確ä¿ããããã«äœ¿çšãããŸãããã¹ããªãŒã ãçä¿¡ãã¬ãŒã ã«å¯Ÿå¿ã§ããªãå Žåãéåžžã®æ¹æ³ã§å°æ¥ã®åŠçã®ããã«ãã¬ãŒã ãä¿åãããšãRAMãå¶åŸ¡äžèœã«æ¶è²»ãããŸãã FastMemPoolã䜿çšãããšããªãŒããŒãããŒãçºçããå Žåãå²ãåœãŠäžã«nullptrãè¿ããããã¬ãŒã ãã¹ããããããŸããæçµçãª3Dã€ã¡ãŒãžã§ã¯ãã¹ãããã®ãžã£ã³ããšããåœ¢ã®æ¬ é¥ã¯ãCPUã¹ã¬ãããåŠçã«è¿œå ããå¿ èŠãããããšã瀺ããŠããŸãã
埪ç°ã¡ã¢ãªã¢ãã±ãŒã¿ãšã¿ã¹ã¯ã¹ã¿ãã¯ã䜿çšããã¹ã¬ããã®ãã¥ãŒããã¯ã¹ããªãŒæäœã«ããããã¬ãŒã æå€±ãRAMã®ãªãŒããŒãããŒãªãã«ãçä¿¡ãã¬ãŒã ãéåžžã«è¿ éã«åŠçã§ããŸãããçŸåšããã®ã³ãŒãã¯AMD Ryzen 9 3950X CPUã®16ã¹ã¬ããã§å®è¡ãããFastMemPoolã¯ã©ã¹ã®é害ã¯ç¢ºèªãããŠããŸããã
ç°¡ç¥åãããäŸ-RAMãªãŒããŒãããŒå¶åŸ¡ã䜿çšãããããªåæããã»ã¹ã®å³ã¯ããœãŒã¹ã³ãŒãtest_memcontrol1.cppã«ãããŸãã
ãããŠãã¶ãŒãã®å ŽåïŒåãã¹ããŒã äŸã§ã¯ãéãã¥ãŒããã¯ã¹ã¹ã¿ãã¯ã䜿çšãããŸãïŒ
using TWorkStack = SpecSafeStack<VideoFrame>;
//..
// Video frames exchanger:
TWorkStack work_stack;
//..
work_staff->work_stack.push(frame);
//..
VideoFrame * frame = work_staff->work_stack.pop();
ãã¹ãŠã®ãœãŒã¹ãåããå®çšçãªãã¢ã¹ã¿ã³ãã¯ãgihubã«ãããŸãã