代码拉取完成,页面将自动刷新
c++线程安全内存池,与c++容器和自定义类轻松搭配使用。适用于有大量对象、反复释放构建对象的场景
开启四个线程,每个线程向各自std::list容器添加四种对象各五百万个并释放,各线程重复此操作十次(测试代码在main.cpp)
int main(int argc, char* argv[])
{
//data只在主线程使用,所以使用AllocWkT(线程归属的悟空内存池)将有更高的效率
std::list<int, AllocWkT<int>> data{ 1, 2, 3, 4 };
for (auto& elem : data) ++elem;
return 0;
}
std::list<int, AllocWkG<int>> producer()
{
return std::list<int, AllocWkG<int>>{1, 2, 3, 4};
}
void consumer(std::list<int, AllocWkG<int>>& data)
{
for (auto& elem : data) ++elem;
}
int main(int argc, char* argv[])
{
//在生产者线程获得数据
auto future{std::async(std::launch::async, producer)};
auto data{ future.get() };
//在主线消费
consumer(data);
//data跨越主线程和生产者线程,属于全局归属,故使用AllocWkG(全局归属悟空内存池)保证内存回收正确
return 0;
}
2.多态说明
class Human : public UseWkTP
{
std::string _name;
public:
virtual void work()
{
std::cout << "human work\n";
}
virtual ~Human(){}
};
class Teacher : public Human
{
int _id;
public:
void work() override
{
std::cout << "teacher work\n";
}
};
int main(int argc, char* argv[])
{
//Teacher对象使用Human指针delete,使用多态特性,故使用UseWkTP(线程归属、多态特性的悟空内存池),
//使用线程还是全局归属上方已说明,使用多态特性保证正确回收空间
//如无多态或未使用基类指针指向派生类,则无需使用多态特性内存池
Human* teacher{ new Teacher };
delete teacher;
return 0;
}
总结:如出现多态类或使用基类指针指向派生类,请使用多态特性内存池。其余情况无需使用,将有更小的开销
编译器支持c++11及以上
详细使用说明见main.cpp
以下均已悟空内存池为例,其他内存池替换对应名称缩写即可
下方__代表内存池归属和多态特性,根据实际情况选择
引入同文件即可 (1)要使用某一种内存池直接include对应内存池头文件,如使用悟空内存池,#include "WukongMemoryPool.hpp"
(2)如果使用全部内存池也可直接#include "MemoryPool.hpp"
自定义对象使用内存池 (公有继承UseWk__)
#include "WukongMemoryPool.hpp"
using namespace hzw;
class A : public UseWk__ {...};//使用悟空内存池
A* a{new A};//从悟空内存池分配内存
delete a;//将内存块归还悟空内存池
容器使用内存池
#include "WukongMemoryPool.hpp"
using namespace hzw;
std::list<int, AllocWk_<int>> list;//使用悟空内存池
直接使用内存池
#include "WukongMemoryPool.hpp"
using namespace hzw;
int main(int argc, char* argv[])
{
size_t bufSize{ 100 };
char* buf{ static_cast<char*>(WkG::allocate(bufSize)) };//从悟空内存池获取内存
WkG::deallocate(buf, bufSize);//归还内存块
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。