object pool

Boost开发指南-3.9object_pool public :public ://构造函数 ~ object_pool();//析构函数 element_type * malloc();//分配内存 void free(element_type * p);//归还内存 bool is_from(element_type * p) const;//创建对象 void destroy(element_type * p);//销毁对象 }; 阅读详情
#include "stdafx.h"

#include <algorithm>
#include <cassert>
#include <iostream>
#include <map>
#include <memory>
#include <stack>
#include <vector>
#include <string>
#include <chrono>
#include <set>
#include <random>
using namespace std;

#define __AVX__

#ifdef __AVX__
#include <immintrin.h>
#else
#warning No AVX support - will not compile
#endif

//from granite
void* memalign_alloc(size_t boundary, size_t size)
{
#if defined(_WIN32)
    return _aligned_malloc(size, boundary);
#elif defined(_ISOC11_SOURCE)
    return aligned_alloc(boundary, size);
#elif (_POSIX_C_SOURCE >= 200112L) || (_XOPEN_SOURCE >= 600)
    void *ptr = nullptr;
    if (posix_memalign(&ptr, boundary, size) < 0)
        return nullptr;
    return ptr;
#else
    // Align stuff ourselves. Kinda ugly, but will work anywhere.
    void **place;
    uintptr_t addr = 0;
    void *ptr = malloc(boundary + size + sizeof(uintptr_t));

    if (ptr == nullptr)
        return nullptr;

    addr = ((uintptr_t)ptr + sizeof(uintptr_t) + boundary) & ~(boundary - 1);
    place = (void **)addr;
    place[-1] = ptr;

    return (void *)addr;
#endif
}


void* memalign_calloc(size_t boundary, size_t size)
{
    void* ret = memalign_alloc(boundary, size);
    if (ret)
        memset(ret, 0, size);
    return ret;
}

void memalign_free(void* ptr)
{
#if defined(_WIN32)
    _aligned_free(ptr);
#elif !defined(_ISOC11_SOURCE) && !((_POSIX_C_SOURCE >= 200112L) || (_XOPEN_SOURCE >= 600))
    if (ptr != nullptr)
    {
        void **p = (void **)ptr;
        free(p[-1]);
    }
#else
    free(ptr);
#endif
}

template <typename T>
class ObjectPool
{
public:
    template <typename... P>
    T* allocate(P&&... p)
    {
#ifndef OBJECT_POOL_DEBUG
        if (vacants.empty())
        {
            unsigned num_objects = 64u << memory.size();
            T* ptr = static_cast<T*>(memalign_alloc(std::max(size_t(64), alignof(T)),
                                                    num_objects * sizeof(T)));
            if (!ptr)
                return nullptr;

            for (unsigned i = 0; i < num_objects; i++)
                vacants.push_back(&ptr[i]);

            memory.emplace_back(ptr);
        }

        T* ptr = vacants.back();
        vacants.pop_back();
        new(ptr) T(std::forward<P>(p)...);
        return ptr;
#else
        return new T(std::forward<P>(p)...);
#endif
    }

    void free(T* ptr)
    {
#ifndef OBJECT_POOL_DEBUG
        ptr->~T();
        vacants.push_back(ptr);
#else
        delete ptr;
#endif
    }

    void clear()
    {
#ifndef OBJECT_POOL_DEBUG
        vacants.clear();
        memory.clear();
#endif
    }

protected:
#ifndef OBJECT_POOL_DEBUG
    std::vector<T*> vacants;

    struct MallocDeleter
    {
        void operator()(T* ptr)
        {
            memalign_free(ptr);
        }
    };

    std::vector<std::unique_ptr<T, MallocDeleter>> memory;
#endif
};


struct A
{
    int aa[10];
};

struct B
{
    int aa[1];
};


struct C
{
    char aa[11];
};

struct D
{
    char aa[110];
};

struct E
{
    char aa[9];
};

unsigned long long SIZE = 0;


#if 0
int x = 0;
void tt()
{
    int rd = x % 5;
    x++;

    switch (rd)
    {
    case 0:
        {
            new A;
            SIZE += sizeof(A);
            break;
        }

    case 1:
        {
            new B;
            SIZE += sizeof(B);
            break;
        }

    case 2:
        {
            new C;
            SIZE += sizeof(C);
            break;
        }

    case 3:
        {
            new D;
            SIZE += sizeof(D);
            break;
        }

    case 4:
        {
            new E;
            SIZE += sizeof(E);
            break;
        }
    }
}


int main(int argc, char** argv)
{
    auto t = clock();

    for (int i = 0; i < 1000 * 10000; i++)
        tt();

    cout << "time: " << (clock() - t) << endl;

    cout << SIZE / (1024 * 1024) << endl;


    getchar();
    return 0;
}

#else

ObjectPool<A> pools_a;
ObjectPool<B> pools_b;
ObjectPool<C> pools_c;
ObjectPool<D> pools_d;
ObjectPool<E> pools_e;

int x = 0;

void tt()
{
    int rd = x % 5;
    x++;
    switch (rd)
    {
    case 0:
        {
            pools_a.allocate();
            SIZE += sizeof(A);
            break;
        }

    case 1:
        {
            pools_b.allocate();
            SIZE += sizeof(B);
            break;
        }

    case 2:
        {
            pools_c.allocate();
            SIZE += sizeof(C);
            break;
        }

    case 3:
        {
            pools_d.allocate();
            SIZE += sizeof(D);
            break;
        }

    case 4:
        {
            pools_e.allocate();
            SIZE += sizeof(E);
            break;
        }
    }
}

int main(int argc, char** argv)
{
    auto t = clock();

    for (int i = 0; i < 1000 * 10000; i++)
        tt();

    cout << "time: " << (clock() - t) << endl;

    cout << SIZE / (1024 * 1024) << endl;


    getchar();
    return 0;
}
#endif

boost::object_pool使用 1、boost::object_pool是用于类实例的内存池,析构时对所有已经分配的内存块调用析构函数。 2、常用函数construct从内存池中创建一块对象内存,最多支持三个参数;destroy()用来销毁对象。 3、函数调用失败不会抛出异常,会返回空指针,所以我们可以使用空指针进行判断是否成功。 4、示例: #include <iostream> #include &lt... 阅读详情

相关推荐

避坑指南:Windows下OpenCV摄像头索引混乱问题的3种解决之道

本文详细解析了Windows下OpenCV摄像头索引混乱问题的3种解决方案,包括GUID查询法、DirectShow接口集成和注册表固化技术。针对工业视觉和智能监控场景,提供实战代码和性能优化建议,帮助开发者稳定识别多路摄像头设备,有效解决VideoCapture接口的索引漂移问题。

weixin_30836759的博客 406

boost的pool和object_pool

boost的pool和object_pool

dreamcs的专栏 3435

树莓派使用 OLED 屏显示图片及文字

树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看。这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片。本文将详细介绍操作方法。 OLED 模组介绍 OLED 屏主要有两种:128×32 和 128×64 ,主要颜色是白、黄、蓝。OLED 屏的特点是功耗低,价格便宜,使用 I2C 接口与主机连接。本文所使用的是 128×64 尺寸的屏幕,外形如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

码到成功 3743

Boost库学习随记四 pool内存池使用示例:pool、object_pool、singleton_pool、pool_alloc内存池

#include #include #include #include #include #include using namespace std; using namespace boost; //pool内存池使用示例:pool void pool_pool_fun() { pool<>pl(sizeof(int)); //一个可分配int的内存池 int *p = (i

创造神话,实现梦想! 2849

Qt快速读取Excel文件

网上很多读取方式都是如下形式,太慢了,打开文件+读取文件要6s以上,实在是受不了! QAxObject excel("Excel.Application"); excel.setProperty("Visible", false); QAxObject *work_books = excel.querySubObject("WorkBooks"); work_boo...

c+c++的博客 2万+

Cherry Studio 新手必看:5分钟搞定MCP服务器配置(附常见问题解决)

本文为Cherry Studio新手提供了详细的MCP服务器配置指南。文章从核心概念入手,解释了Cherry Studio作为MCP客户端如何通过MCP协议安全、标准化地扩展AI助手能力。重点讲解了uv和Bun环境的安装与常见网络问题的解决方案,并演示了如何添加首个MCP服务器(如mcp-server-fetch),助你快速构建可扩展的智能工作流。

corn8的博客 595

boos库中object_pool和singleton_pool内存池应用详解

T:要分配的对象类型。:底层内存分配器,默认用new/delete。Tag:用来区分不同池的标签类型(通常用空 struct)。:单个块的大小(字节数)。:底层分配器。Mutex:线程安全控制。NextSize:下次分配块数。MaxSize:池的最大容量(0 表示无限)。:面向单一对象类型,自动管理构造/析构,适合局部池化对象。:面向任意大小块,全局共享,适合作为allocator 基础。如果你在做 SLAM 系统(比如点云特征、约束边等对象管理),临时小对象推荐。

qq_36812406的博客 1186

微信小程序 - 实现嵌套H5页面唤起微信支付的实现方案+完整流程源码,微信小程序webview(H5页面)调用微信小程序支付,嵌套h5页面怎么实现小程序支付(Vue2/3移动端H5网页、公众号网页等)

h5嵌入微信小程序微信支付,H5网页嵌入到微信小程序内如何支付,微信小程序webview组件交互,内联h5页面并网页实现微信支付,微信H5页面实现微信小程序支付,微信小程序嵌套webview实现小程序微信支付,小程序中内嵌H5网页支付怎么办,用网页的支付还是小程序的支付?支付没反应,支付报错怎么办,微信小程序内嵌h5,h5调用小程序支付功能解决方案,H5网页cors跨域,真机测试无法唤起支付,无法唤起支付,uniapp微信小程序,h5小程序调用微信支付,微信小程序内嵌H5页面,如何实现微信支付功能,微信小程

🏆 前端领域优质创作者 1万+

Boost中object_pool使用案例及让construct()支持任意参数模板

object_pool使用案例1 简介Boost::object_pool 1 简介Boost::object_pool

我爱加菲猫 1273

“守望先锋”网络同步分析

守望先锋”(Overwatch)是一款由暴雪娱乐开发的团队基础第一人称射击游戏(FPS),于2016年正式发布。游戏以其独特的角色设计、丰富的游戏模式和高度的团队合作性而受到广泛欢迎。类型:第一人称射击(FPS)/多人在线战斗竞技场(MOBA元素)平台玩家人数:每场比赛由两个六人队伍组成,共12名玩家。客户端/服务器模型:在这种模型中,客户端负责处理用户输入和表现逻辑,而服务器则负责游戏的核心逻辑和状态管理。客户端与服务器之间通过网络进行通信,确保游戏状态的一致性。强同步机制。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 425

使用MATLAB/Simulink搭建一个简化的无人机螺旋桨气动特性模型,并通过仿真验证其基本功能

螺旋桨概述特点:螺旋桨通过旋转产生推力,推动无人机前进或上升。关键参数直径(D):影响推力和功率消耗。螺距(P):定义了螺旋桨每转一圈理论上前进的距离。效率(η):衡量螺旋桨将机械能转化为推力的有效性。应用场景:航拍摄影、农业监测、物流配送等。仿真目标搭建一个简化的无人机螺旋桨气动特性模型,涵盖从电机输入到螺旋桨输出推力的过程。分析不同条件下的系统响应特性(如推力、功率消耗),并探讨优化螺旋桨设计的方法。定义螺旋桨的一些基本物理参数,如直径、螺距、推力系数、功率系数等。使用Constant。

xiaoheshang_123的博客 428

apache-common-pool2 异常:Returned object not currently part of this pool

参考博文: https://issues.commons.apache.narkive.com/sdkDV3th/jira-created-pool-284-returned-object-not-currently-part-of-this-pool-when-using-mutable-objects https://blog.youkuaiyun.com/liang_love_java/articl...

哇哇哇,真的学到了!!! 5749

RK3588平台开发系列讲解(项目篇)常见模型结构

📢 AI 模型常采用人工神经网络来模拟人脑神经的记忆和处理信号的能力。常见的人工神经网络类型有深度神经网络(Deep Neural Network,DNN)、卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurrent Neural Network,RNN)等。

内核笔记 1756

boost::object_pool

boost pool是个不错的库,可以省点内存管理功夫,内存池分配内存,还可以速度上比malloc更快一些。   boost::object_pool主要针对,对象的内存分配,他可以像使用new 一样来创建对象,对象的内存放在object_pool里面。 实际上object_pool使用pool类,代码上是object_pool继承pool类,ob...

我的天下 601

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

boost pool, object_pool实现

一: class simple_segregated_storage; boost/pool/simple_segregated_storage.hpp simple_segregated_storage (以下用SSS替代)实现一个单向链表, 链表的每个节点是一个固定大小

kannju的专栏 1602

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ceph存储pg、object、pool、osd、image对应存储位置查询

pg, osd, pool 之间的一些查找方法 1. pg --> osd: 通过 pg 查找 osd ceph pg map {pgid} 2. osd --> pg: 通过 osd 查找 pg ceph pg ls-by-osd osd.{osdid} 3. pg --> pool: 通过 pg 查找 pool ceph pg dump | grep "^{po...

pansaky的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

boost object pool的destroy() 效率太慢了

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34297300的博客 308

快速对象池(fast-object-pool)使用指南

快速对象池(fast-object-pool)使用指南 1. 项目目录结构及介绍 fast-object-pool 是一个轻量级且高性能的对象池实现,特别优化了并发访问场景。以下为其基本的目录结构及各部分简介: fast-object-pool/ ├── src # 源代码目录 │ ├── main ...

gitblog_00332的博客 1032

Ceph集群中的逻辑结构 — Object、Pool、PG

Ceph中的逻辑对象有Object、Pool、PG,本文简单介绍相关的概念以及之间的关系,PG状态变化过程等。

李少侠 3973

BOOST内存管理(一) --- boost::object_pool

boost pool是个不错的库,可以省点内存管理功夫,内存池分配内存,还可以速度上比malloc更快一些。 boost::object_pool主要针对,对象的内存分配,他可以像使用new 一样来创建对象,对象的内存放在object_pool里面。 实际上object_pool使用pool类,代码上是object_pool继承pool类,object_pool比pool多些什么呢,多

liujiayu2的专栏 1431

boost准模板库内存管理中pool和object_pool的使用

首先,在敲代码之前,必须改动一个问题。要不然,无法链接:  boost安装文件夹:D:\boost。       找到D:\boost\boost_1_55_0\include\boost-1_55\boost\system\error_code.hpp。       在error_code.hpp文件开头加入宏定义:#define BOOST_ERROR_CODE_HEADER_O...

weixin_33831196的博客 298

常见问题解决方案:fast-object-pool 项目

常见问题解决方案:fast-object-pool 项目 1. 项目基础介绍和主要编程语言 项目名称: fast-object-pool 项目简介: fast-object-pool 是一个轻量级、高性能的对象池,专为并发访问优化。它可以用于管理昂贵的对象,如 JDBC 连接、Thrift 客户端等。 主要编程语言: Java 2. 新手在使用这个项目时需要特别注意的3个问题和解决步骤 问题一:如...

gitblog_00598的博客 901

使object_pool支持3个以上构造函数参数

boost中的object_pool的construct函数最多支持3个参数,但是可以扩展,我用了辅助函数模板的方式: #include using namespace boost; class demo_class { public: int x,y,z,w; demo_class(int x=1,int y=2,int z=3,int w=4):x(x),y(y),z(z),w(w)

Always On The Way 760

Boost(1.84)内存池object_pool对象构建

Boost(1.84)库object_pool类解析

m0_52862825的博客 723

Boost内存管理总结(scoped_ptr、unique_ptr、shared_ptr、weak_ptr、intrusive_ptr、pool、object_pool、singleton_pool)

内存管理总结1 简要介绍2 思维导图 1 简要介绍 Boost的内存管理库,包含两部分内容,分别是smart_ptr库和pool库,其中我们熟知的shared_ptr、unique_ptr、weak_ptr早已在2011年引入C++11标准。 smart_ptr库包含scoped_ptr、unique_ptr、shared_ptr、weak_ptr、intrusive_ptr pool库包含pool、object_pool、singleton_pool 2 思维导图 下面是Boost中内存管理思维图,包

我爱加菲猫 594
上一篇: vulkan triangle
下一篇: 大气渲染截图
不如学也
博客等级 码龄12年 22粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值