再开源一款轻量内存池

news2024/12/27 11:40:00

前两天已开源线程池,开源一款轻量线程池项目,本节继续开源另一个孪生兄弟:内存池。

本节的线程池与内存池代码解析会在我的星球详细讲解。

内存池:https://github.com/Light-City/light-memory-pool

线程池:https://github.com/Light-City/light-thread-pool

34a3cebc857d9a49596cb085b3847c9a.jpeg

基于Arrow的轻量内存池

这个项目的内存池是基于Apache Arrow项目的衍生版本。我们将Arrow项目中复杂的核心结构——内存池——完全剥离出来,形成了这个独立的项目。由于原始的内存池与Arrow项目本身的工具有深度依赖关系,因此我们在这个项目中对内存池进行了一些深度移除和改造,以保持与原始Arrow内存池的基础功能一致。一些改动包括:

  • 分离allocator与memory_pool

  • 移除不需要的LoggingMemoryPool、ProxyMemoryPool

  • 移除jemalloc等第三方malloc库,未来可以支持

通过这些改动,我们的目标是:

  • 使代码更加精简

  • 使内存池更方便地作为其他项目的依赖库使用

  • 提供简单的方式来引入本项目的so库和头文件,以使用内存池功能

此外,这个项目还可以作为深入学习内存池设计与实现的资源。我们欢迎您探索并使用这个经过精心改进的内存池。

1.如何编译

➜  bazel build //src:memory_pool 
WARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.
WARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.
INFO: Analyzed target //src:memory_pool (36 packages loaded, 169 targets configured).
INFO: Found 1 target...
Target //src:memory_pool up-to-date:
  bazel-bin/src/libmemory_pool.a
  bazel-bin/src/libmemory_pool.dylib
INFO: Elapsed time: 1.568s, Critical Path: 1.05s
INFO: 10 processes: 4 internal, 6 darwin-sandbox.
INFO: Build completed successfully, 10 total actions

2.如何使用

所有的用例放在examples目录

2.1 编写一个简单的case

参见:helloworld

arrow::MemoryPool* pool = arrow::default_memory_pool();

char* val;
arrow::Status status = pool->Allocate(14, reinterpret_cast<uint8_t**>(&val));

if (status.ok()) {
    std::cout << "Memory allocation successful." << std::endl;
    std::strcpy(val, "Hello, World!");
    std::cout << "Filled content: " << val << std::endl;
    pool->Free(reinterpret_cast<uint8_t*>(val), 4);
} else {
    std::cout << "Memory allocation failed." << std::endl;
}

编译:

➜  bazel build //examples:hello_world 
WARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.
WARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.
INFO: Analyzed target //examples:hello_world (0 packages loaded, 2 targets configured).
INFO: Found 1 target...
Target //examples:hello_world up-to-date:
  bazel-bin/examples/hello_world
INFO: Elapsed time: 0.881s, Critical Path: 0.73s
INFO: 7 processes: 5 internal, 2 darwin-sandbox.
INFO: Build completed successfully, 7 total actions

运行:

➜  bazel-bin/examples/hello_world
Memory allocation successful.
Filled content: Hello, World!

3.如何测试

测试基于catch2编写,所有测试位于tests目录

可以测试tests目录下面的其他测试,只需要替换submit_test为对应的test即可。

bazel test //tests:memory_pool_test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue-组件基础(上)

一、目标 能够说出什么是单页面应用程序和组件化开发能够说出.vue单文件组件的组成部分能够知道如何注册vue的组件能够知道如何声明组件的props属性能够知道如何在组件中进行样式绑定 二、目录 单页面应用程序vite的基本使用组件化开发思想vue组件的构成组件的基本使用封装组…

await、async、事件循环(宏任务、微任务队列执行顺序)

1 async、await 2 浏览器进程、线程 3 宏任务、微任务队列 4 Promise面试题解析 5 throw、try、catch、finally 异步函数-异步函数的写法 // 普通函数// function foo() {}// const bar function() {}// const baz () > {}// 生成器函数// function* foo() {}// 异步函…

效果超过deepsort,yolov5+bytetrack

目录 1. Motivation 2. BYTE 3. ByteTrack 4.完整代码实现 ByteTrack: Multi-Object Tracking by Associating Every Detection Box 沿着多目标跟踪&#xff08;MOT&#xff09;中tracking-by-detection的范式&#xff0c;我们提出了一种简单高效的数据关联方法BYTE。 利用…

git : 从入门到进阶(实战问题对策)

目录 0. 前言 1. git stash: 暂时保存本地修改 0. 前言 记录日常git使用过程中碰到的一些常见问题的解决&#xff0c;以及一些常用技巧。作为自己作为git使用者的从入门到进阶的成长过程。不求完备但求简洁实用。动态更新。。。 1. git stash: 暂时保存本地修改 多人工作的项…

Linux自主学习 - 多线程的创建(#include<pthread.h>)

备注&#xff1a;vscode通过ssh连接虚拟机中的ubuntu&#xff0c;ubuntu-20.04.3-desktop-amd64.iso 函数pthread_create() // pthread.h中的函数pthread_create()extern int pthread_create (pthread_t *__restrict __newthread, // 线程标识符const pthread_attr_t *…

【039】掌握Vector容器:C++中最强大的动态数组

掌握Vector容器&#xff1a;C中最强大的动态数组 引言一、vector容器概述二、vector的数据结构三、vector常用的API操作3.1、vector构造函数3.2、vector常用的赋值操作3.3、vector的大小操作3.4、vector存取数据操作3.5、vector插入和删除操作 四、vector的未雨绸缪机制五、巧用…

数据库应用:CentOS 7离线安装PostgreSQL

目录 一、理论 1.PostgreSQL 2.PostgreSQL离线安装 3.PostgreSQL初始化 4.PostgreSQL登录操作 二、实验 1.CentOS 7离线安装PostgreSQL 2.登录PostgreSQL 3.Navicat连接PostgreSQL 三、总结 一、理论 1.PostgreSQL &#xff08;1&#xff09;简介 PostgreSQL 是一个…

vue3 -- mitt 插件使用

介绍 mitt插件是Vue3中的一种第三方总线插件,它可以用于在组件之间进行通信。相比于Vue实例上的EventBus,mitt.js足够小,仅有200bytes,支持全部事件的监听和批量移除,它还不依赖Vue实例,所以可以跨框架使用,React或者Vue,甚至jQuery项目都能使用同一套库 . 使用 1:下载插…

Interactive Image Segmentation

Focused and Collaborative Feedback Integration for Interactive Image Segmentation CVPR 2023 清华 Interactive image segmentation aims at obtaining a segmentation mask for an image using simple user annotations. During each round of interaction, the segment…

windows打开此类文件前总是询问怎么解决

打开此类文件前总是询问怎么解决这个一直提示的问题呢&#xff1f; 下面来教大家一个方法杜绝再提示&#xff1a; 开始 --> 运行 --> gpedit.msc (组策略) --> 用户配置 --> 管理模板 --> windows组件 --> 附件管理器 --> 右击 "中等危险文件类型的包…

再学JavaScript

九、常见的运算符 两个等号只判断值&#xff0c;三个等号判断值和类型是否相等 逻辑运算符 注意&&和& ||和| 短路 赋值运算符 自加自减运算符 三目运算符 移位运算符 十、JavaScript的数据类型转换 假如用默认值10&#xff0c;控制台结果就是1035&#xff08…

学生管理系统--java+mysql

学生管理系统 简介 练习&#xff1a;完成学生信息的增删查改&#xff08;根据id&#xff09;&#xff0c;项目进行了三层架构进行创建。 pojo层&#xff0c;dao层&#xff0c;service层&#xff0c;utils层&#xff0c;程序入口&#xff1b; 1.pojo层 实体层 数据库在项目…

基于linux下的高并发服务器开发(第一章)- dup,dup2函数

int dup(int oldfd);复制文件描述符 /*#include <unistd.h>int dup(int oldfd);作用&#xff1a;复制一个新的文件描述符fd3, int fd1 dup(fd),fd指向的是a.txt, fd1也是指向a.txt从空闲的文件描述符表中找一个最小的&#xff0c;作为新的拷贝的文件描述符*/#include &…

80C51定时/计数器的应用之实现PWM(脉冲宽度调制)

知识来源于链接&#xff1a;https://www.bilibili.com/video/BV1eT4y1J7wB/?spm_id_from333.880.my_history.page.click&vd_sourceb91967c499b23106586d7aa35af46413 这种模拟实现 PWM 波的应用只能应用于对波形精度和频率要求不高的情况下。 一、程序思路分析 这里想要…

Redis缓存雪崩、穿透、击穿原因分析和解决方案,附Redis管道使用技巧

先给大家附上其他几篇文章&#xff0c;感兴趣的自行开车导航 Redis过期策略和持久化机制全面揭秘&#xff0c;教你如何合理配置 【深入浅出Redis 一】从版本特性到数据类型到线程模型&#xff0c;带你了解Redis的核心特性和应用场景&#xff01; 一次redis OOM问题分析解决&…

PyTorch深度学习——Anaconda和PyTorch安装

一、Anaconda安装 前言 安装anaconda后主要有一下3点好处&#xff1a; 1.包含环境管理器conda。 2.大量安装基于python的工具包。 3.可以创建使用和管理不同的python版本。 附上百度百科的解释&#xff1a; 下载步骤&#xff1a; 1.官网下载anaconda 2.双击之后安装即可 …

【Linux】进程间通信——管道与共享内存

文章目录 前言 1、三个问题1-1、什么是通信&#xff1f;1-2、为什么要有通信1-3、怎么进行通信&#xff1f;1-4、进程间通信分类 2、管道2-1、匿名管道2-1-1、理解通信本质问题2-1-2、进一步理解管道2-1-3、代码实现pipe函数 2-1-4、读写特征2-1-5、管道的特点&#xff08;重点…

MQTT springboot + idea

参考链接&#xff1a;&#xff08;第一个是理论 第二个是代码 我是直接cv的 我就不贴代码了&#xff09; MQTT协议基本流程、原理_mqtt协议工作原理_Nimrod__的博客-CSDN博客 SpringBoot整合MQTT_springboot mqtt_N_P_E的博客-CSDN博客 EMQX 入门教程③——默认端口、端口策…

10.Java 基本数据类型与包装类之间的转换

Java 的包装类便是一种特殊的引用数据类型&#xff0c;因为其是与基本数据类型一一对应的 1.装箱和拆箱 装箱指的是将基本数据类型转为包装类&#xff1b;拆箱指的是将包装类转为基本数据类型 1.1 int 与 Integer 之间的转换 int → Integer int i 13; Integer integer I…

基于JSP+servlet+JDBC开发的人物管理系统

文章目录 技术说明【效果图】源码 技术说明 后端&#xff1a;JspServletJDBC 前端&#xff1a;BootStrap技术 数据库&#xff1a;Mysql 其他&#xff1a;ckeditor富文本编辑器、FileUpload组件上传图片、MD5加密技术 功能&#xff1a;人物的增删改查 【效果图】 源码 https:…