通常創建物件使用new操作,但這樣無法指定在具體某一塊記憶體開辟空間創建物件,而如果
可以指定開辟空間的記憶體位置,我們可以撰寫記憶體池高效的復用同一個記憶體位置,這樣可以避免系統頻繁申請可用記憶體
所占用的時間以及記憶體碎片問題,
指定具體分配記憶體的具體位置,可以重寫new運算子實作:
h:
//Class1.h #pragma once class Class1 { public: void* operator new(size_t size); };
cpp:
//Class1.cpp #include "Class1.h" #include "stdio.h" void* Class1::operator new(size_t size) { printf("operator new!\n"); return ::operator new(size);//這里可以自定義 }
使用:
int main() { Class1* c = new Class1();//觸發new重寫 }
此時可以在類的內部指定new操作行為,以及如何分配記憶體,
而通過placement new則可以在外部指定分配記憶體的具體位置(注意,使用了placement new就不能呼叫delete):
.h:
//Class1.h #pragma once class Class1 { private: int x; int y; int z[4]; public: void Init(); };
.cpp:
//Class1.cpp #include "Class1.h" #include "stdio.h" void Class1::Init() { x = 1; y = 2; z[0] = 10; z[1] = 11; z[2] = 12; z[3] = 13; }
使用:
int main() { int mem[sizeof(Class1)]; Class1* c = new (mem)Class1; c->Init(); for (int item : mem)//除錯 { printf("%d\n", item); }; //1 //2 //10 //11 //12 //13 //-858993460 //... }
可以看見,指定了分配區域后,除了實作記憶體池,還可以方便的對分配好的記憶體進行除錯,在UE4中,部分物件的創建就是使用placement new特性進行操作的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458172.html
標籤:C++
