当前位置: 首页 > news >正文

手把手教你实现C++高性能内存池,相比 malloc 性能提升7倍!

大家好,我是小康。

写在前面

你知道吗?在高并发场景下,频繁的mallocfree操作就像是程序的"阿喀琉斯之踵",轻则拖慢系统响应,重则直接把服务器拖垮。

最近我从0到1实现了一个高性能内存池,经过严格的压测验证,在8B到2048B的分配释放场景下,性能相比传统的malloc/free平均快了4.5倍!今天就来给大家分享这个实现过程,相信看完后你也能写出自己的高性能内存池。

数据最有说服力,来看看实测结果:

看到了吗?相比标准malloc/free,平均性能提升4.62倍,最高达到7.37倍!

手把手教你实现C++高性能内存池,相比 malloc 性能提升7倍!

为什么需要内存池?

在开始撸代码之前,我们先来聊聊为什么要造这个轮子。

传统内存分配的痛点

你有没有遇到过这些情况:

  1. 频繁分配小对象:比如游戏服务器中每秒创建成千上万个临时对象
  2. 内存碎片化:明明还有很多空闲内存,但就是分配不出连续的大块
  3. 性能瓶颈:高并发场景下malloc成为系统的性能瓶颈
  4. 内存泄漏:忘记free导致的内存泄漏,让人头疼不已

这些问题的根源在于:系统级的内存分配器设计得太通用了。它要处理各种大小的内存请求,要考虑各种边界情况,这就导致了性能上的妥协。

内存池的优势

内存池就像是给程序开了个"专属食堂":

  • 速度快:预先分配好内存,拿来就用,不用每次都找系统要
  • 减少碎片:统一管理,按需切分,内存利用率更高
  • 避免泄漏:集中管理,程序结束时统一释放
  • 可控性强:自己的地盘自己做主,可以根据业务特点优化

设计思路:三层架构设计

经过大量调研和思考,我采用了类似TCMalloc的三层架构:

┌─────────────────────────────────────────────────────────┐
│                   应用程序                                │
└─────────────────────┬───────────────────────────────────┘│ ConcurrentAlloc() / ConcurrentFree() 
┌─────────────────────▼───────────────────────────────────┐
│              ThreadCache (线程缓存)                      │
│  ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐                       │
│  │ 8B  │ │16B  │ │32B  │ │...  │  每个线程独享           │
│  │List │ │List │ │List │ │List │                       │
│  └─────┘ └─────┘ └─────┘ └─────┘                       │
└─────────────────────┬───────────────────────────────────┘│ 批量获取/归还
┌─────────────────────▼───────────────────────────────────┐
│             CentralCache (中央缓存)                      │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐                   │
│  │ 8B Span │ │16B Span │ │32B Span │  全局共享,桶锁    │
│  │ List    │ │ List    │ │ List    │                   │
│  └─────────┘ └─────────┘ └─────────┘                   │
└─────────────────────┬───────────────────────────────────┘│ 申请新Span
┌─────────────────────▼───────────────────────────────────┐
│               PageHeap (页堆)                           │
│  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                  │
│  │ 1页  │ │ 2页  │ │ 4页  │ │ 8页  │  管理大块内存       │
│  │ Span │ │ Span │ │ Span │ │ Span │                  │
│  └──────┘ └──────┘ └──────┘ └──────┘                  │
└─────────────────────┬───────────────────────────────────┘│ 系统调用
┌─────────────────────▼───────────────────────────────────┐
│                  操作系统                               │
│              (mmap/VirtualAlloc)                       │
└─────────────────────────────────────────────────────────┘

为什么是三层?

这个设计的精妙之处在于分层解耦

  • ThreadCache:每个线程都有自己的缓存,分配时无需加锁,速度飞快
  • CentralCache:当ThreadCache没有合适的内存块时,向CentralCache申请
  • PageHeap:管理大块内存,当CentralCache也没有时,向系统申请内存

这样设计的好处是:大部分情况下分配操作都在ThreadCache完成,无锁且极快;只有在必要时才会涉及锁操作。

第一层:ThreadCache(线程本地缓存)

设计理念:每个线程拥有独立的内存缓存,消除锁竞争。

class ThreadCache {
private:FreeList free_lists_[NFREELISTS];  // 208个不同大小的自由链表static thread_local ThreadCache* tls_thread_cache_;public:void* Allocate(size_t size);void Deallocate(void* ptr, size_t size);
};

核心优化点

  • 无锁设计:线程本地存储,天然线程安全
  • 多级缓存:208个不同大小的自由链表
  • 批量操作:与中心缓存批量交换,减少交互次数

第二层:CentralCache(中心分配器)

设计理念:所有线程共享的中心分配器,负责向ThreadCache提供内存。

class CentralCache {
private:SpanList span_lists_[NFREELISTS];        // Span链表数组std::mutex mutexes_[NFREELISTS];         // 桶锁数组public:size_t FetchRangeObj(void*& start, void*& end, size_t n, size_t size);void ReleaseListToSpans(void* start, size_t size);
};

核心优化点

  • 桶锁设计:每个大小类别独立锁,减少锁竞争
  • Span管理:每个Span管理一组连续页面
  • 批量分配:一次分配多个对象给ThreadCache

第三层:PageHeap(页堆管理器)

设计理念:管理大块内存页面,是系统内存和应用的桥梁。

class PageHeap {
private:SpanList span_lists_[POWER_SLOTS];  // 只管理2的幂次页数PageMap2<PAGE_MAP_BITS> page_map_;   // 页面到Span映射,采用基数树来管理public:Span* AllocateSpan(size_t n);void ReleaseSpanToPageHeap(Span* span);
};

核心优化点

  • 2的幂次优化:只分配1,2,4,8,16,32,64,128,256页的Span
  • 智能分裂:大Span智能分裂成小Span
  • 零开销释放:释放直接缓存,无需合并操作

核心数据结构设计

1. 自由链表(FreeList)

这是内存池的基础数据结构,将空闲内存块串成链表:

class FreeList {
private:void* head_;      // 链表头指针size_t size_;     // 当前大小size_t max_size_; // 慢启动最大批量大小public:void Push(void* obj);void* Pop();void PushRange(void* start, void* end, size_t n);size_t PopRange(void*& start, void*& end, size_t n);
};

巧妙设计:利用空闲内存块本身存储链表指针,零额外开销!

static inline void*& NextObj(void* obj) {return *(void**)obj;  // 前8字节存储下一个块的地址
}

2. Span结构

Span是管理连续页面的核心结构:

struct Span {PageID page_id_;        // 起始页号size_t n_;              // 页数Span* next_;            // 双向链表指针Span* prev_;size_t object_size_;    // 切分的对象大小size_t use_count_;      // 已分配对象数void* free_list_;       // 切分后的自由链表bool is_used_;          // 是否使用中
};

关键算法实现

1. 大小类别映射算法

将任意大小映射到固定的大小类别,这是性能的关键:

static inline size_t RoundUp(size_t size) {if (size <= 128) {return Align(size, 8);        // 8字节对齐} else if (size <= 1024) {return Align(size, 16);       // 16字节对齐} else if (size <= 8 * 1024) {return Align(size, 128);      // 128字节对齐} else if (size <= 64 * 1024) {return Align(size, 1024);     // 1KB对齐} else if (size <= 256 * 1024) {return Align(size, 8 * 1024); // 8KB对齐}
}

设计考量:小对象精细对齐,大对象粗粒度对齐,平衡内存利用率和性能。

2. 慢启动批量分配

动态调整批量大小,平衡内存使用和性能:

static size_t NumMoveSize(size_t size) {size_t base_batch;if (size <= 32) {base_batch = 128;    // 小对象大批量} else if (size <= 128) {base_batch = 64;} else if (size <= 512) {base_batch = 32;} else {base_batch = 16;     // 大对象小批量}return base_batch * batch_multiplier;
}

3. 页面映射优化

采用二层基数树,快速查找对象所属的Span:

template<int BITS>
class PageMap2 {
private:static const int LEAF_BITS = BITS / 2;static const int ROOT_BITS = BITS - LEAF_BITS;struct OptimizedLeaf {SubLeaf* sub_leafs[SUB_LEAFS_PER_LEAF];// 延迟初始化,减少内存开销};public:inline void* get(size_t k) const;inline void set(size_t k, void* v);
};

上面展示的是部分核心设计思路的简化代码,实际实现中还包含了更多的边界处理和优化细节。

PS:说实话,能参考TCMalloc架构手搓高性能内存池的人应该不多。我在研究阶段看了网上的几个版本,发现大部分还是基于32位系统设计的,在如今的64位环境下就显得有些局限了。可能是早期教学项目的代码被反复借鉴,缺少针对现代系统的深度优化。

注意: 我这个版本从头开始针对64位系统设计,不仅支持完整的虚拟地址空间,还考虑了现代CPU架构的特性, 至少在设计思路上更贴近实际应用场景。

手把手教你实现C++高性能内存池,相比 malloc 性能提升7倍!

性能优化技巧

1. 分支预测优化

// 利用__builtin_expect优化分支预测
if (__builtin_expect(!list.Empty(), 1)) {return list.Pop();  // 大概率走这个分支
}

2. 内联函数优化

// 热点函数全部内联
static inline size_t GetPageID(void* addr) {return reinterpret_cast<PageID>(addr) >> PAGE_SHIFT;
}

3. 缓存友好的数据结构

// 64字节对齐,匹配CPU缓存行
struct SimpleBatch {void* ptrs[32];    uint8_t count = 0;   
} __attribute__((aligned(64)));

4. 锁优化策略

// 桶锁:每个大小类别独立锁
std::mutex mutexes_[NFREELISTS];// 减少持锁时间
{std::lock_guard<std::mutex> lock(mutexes_[index]);// 最少的临界区代码
}

5. 基于perf的性能分析优化

在内存池开发过程中,perf是我最重要的性能分析工具。下面分享三个实际优化案例:

案例1:发现热点函数并优化

问题发现:使用perf分析发现SizeClass::Index()函数占用了15%的CPU时间

# 性能分析命令
sudo perf record -g ./test_memory_pool
sudo perf report # 发现热点
15.23%  test_memory_pool  [.] SizeClass::Index(unsigned long)8.94%  test_memory_pool  [.] ThreadCache::Allocate(unsigned long)

优化方案:针对最常用的小对象做特殊优化

// 优化前:每次都走复杂的Index计算
size_t index = SizeClass::Index(align_size);// 优化后:小对象直接计算,避免函数调用
size_t index;
if (__builtin_expect(align_size <= 128, 1)) {index = (align_size >> 3) - 1;  // 直接位运算
} else {index = SizeClass::Index(align_size);  // 复杂情况才调用
}

效果验证:再次perf分析,该函数CPU占用降到3.2%,整体性能提升12%

案例2:优化Deallocate的批量处理

问题发现:Deallocate函数中频繁的Push操作CPU耗时较高

12.45%  test_memory_pool  [.] FreeList::Push(void*)7.33%  test_memory_pool  [.] ThreadCache::Deallocate(void*, unsigned long)

优化方案:针对小对象使用批量释放策略

// 优化前:每次都要操作链表
void ThreadCache::Deallocate(void* ptr, size_t size) {size_t index = GetIndex(size);free_lists_[index].Push(ptr);  // 每次都要修改链表头
}// 优化后:使用批量缓冲区
SimpleBatch batches_[32];  // 只为热点大小创建批量void ThreadCache::Deallocate(void* ptr, size_t size) {if (index < 32) {SimpleBatch& batch = batches_[index];batch.ptrs[batch.count++] = ptr;if (batch.count >= 32) {FlushSimpleBatch(index, size);  // 批量刷新到链表}}
}

案例3:解决大量缺页中断问题

问题发现:程序出现大量缺页处理,perf显示__memset_avx2_erms耗时严重

33.67%  test_memory_pool  [.] __memset_avx2_erms
11.22%  test_memory_pool  [.] PageMap2::set_range

优化方案:优化PageMap二层基数树,减少memset调用

// 优化前:每次都要初始化大块内存
class PageMap2 {void* values[HUGE_SIZE];  // 直接分配巨大数组,导致大量memset
};// 优化后:延迟初始化,按需分配
class PageMap2 {struct SubLeaf {void* values[1024];  // 只有8KB,memset很快bool initialized = false;};void ensure_initialized() {if (!initialized) {memset(values, 0, sizeof(values));  // 只清零8KBinitialized = true;}}
};

效果:memset调用减少95%,在高并发场景下性能提升显著。由此可见在高并发场景下不能够大量调用memset。

实际在优化过程中还遇到了很多类似的性能瓶颈,这里只是举了几个例子。perf工具帮助我们精确定位问题,避免了盲目优化,每一次改进都有数据支撑。

实战测试与性能分析

测试环境

  • 系统:ubuntu20.04
  • 编译器:GCC -O3 优化
  • 线程数:16
  • 每线程操作:10000次分配释放

性能提升分析

  1. 小对象优势明显:8B-128B对象提升2-5倍
  2. 中等对象表现优异:256B-1KB对象提升5-6倍
  3. 大对象依然领先:2KB以上对象提升7倍以上

为什么这么快?

  1. 减少系统调用:批量分配减少90%+的系统调用
  2. 消除锁竞争:线程本地缓存 + 桶锁设计
  3. 内存局部性:连续内存分配,缓存友好
  4. 算法优化:O(1)分配释放,无遍历查找

使用方法

接口设计简洁,可以直接替换malloc/free:

// 基础接口
void* ptr = ConcurrentAlloc(1024);
ConcurrentFree(ptr);

项目亮点总结

  1. 三层架构设计:清晰的架构层次,职责分离
  2. 多种优化技术:从算法到实现的全方位优化
  3. 生产级质量:完整的错误处理和边界检查
  4. 高可扩展性:支持自定义配置和扩展
  5. 实测性能卓越:平均4.62倍性能提升

一些思考和收获

这个内存池项目从构思到完成,前后花了我一个月的业余时间。

最初只是想解决项目中的性能瓶颈,没想到越深入越发现内存管理的复杂性。从最简单的链表管理,到三层架构设计,再到各种微观优化,每一步都让我对系统底层有了新的认识。

印象最深的是那次perf分析,发现15%的时间竟然消耗在一个看似简单的Index计算上。这让我意识到,真正的性能优化往往隐藏在最不起眼的地方。

还有那次为了解决PageMap初始化性能问题,我不得不重新设计了整个二级页表结构。原本简单粗暴的大数组分配导致了严重的缺页中断,perf显示__memset_avx2_erms占用了23%的CPU时间。虽然推翻了之前的设计,改用延迟初始化的SubLeaf结构,但看到最终memset调用减少95%的数据时,一切都值得了。

这个项目最大的价值不是代码本身,而是整个优化思维的建立。

现在我看任何性能问题,都会先想:这是架构问题还是实现问题?是算法复杂度的问题还是常数优化的空间?数据访问模式是否缓存友好?锁的粒度是否合理?

如果你也想掌握这项核心技能...

说实话,内存池设计是C++性能优化的核心技能之一。很多大厂面试都会问相关问题,而且在高性能系统开发中经常用到。

这次实现过程中踩过的坑、总结的经验,我觉得对想深入学习C++底层优化的朋友会很有价值。所以我把整个项目的开发过程、设计思路、优化技巧都整理成了一套完整的实战课程。

课程特色

  • 项目驱动:从0到1完整实现,每天都有可运行的版本
  • 渐进式学习:10天学习计划,循序渐进不会卡住
  • 实战导向:重点讲解perf分析、性能调优等实战技能
  • 源码+文档:4000+行完整代码,详细的设计文档

课程内容涵盖:

  • 三层架构的系统性设计思维
  • 无锁编程和多线程优化技巧
  • perf工具进行性能分析的实战方法
  • CPU缓存友好的数据结构设计
  • 从问题发现到解决的完整优化流程

最重要的是,这不只是理论讲解,而是一个完整的工程实践。学完后你将拥有一个可以写在简历上、在面试中展示的高质量项目。

如果你对这个内存池项目感兴趣,可以看这篇文章: 手把手教你实现C++高性能内存池,相比 malloc 性能提升7倍!

想报名的话,赶紧加我微信:jkfwdkf,备注「内存池」!

或者扫下方二维码加我

在这个AI时代,能深入底层、具备系统级优化能力的工程师反而更加稀缺。这个项目的技术深度和工程实践价值,相信能为你的技术成长和职业发展带来实质帮助。

如果你在性能优化方面有什么心得,或者对内存池实现有什么想法,也欢迎在评论区交流。

相关文章:

手把手教你实现C++高性能内存池,相比 malloc 性能提升7倍!

大家好,我是小康。 写在前面 你知道吗?在高并发场景下,频繁的malloc和free操作就像是程序的"阿喀琉斯之踵",轻则拖慢系统响应,重则直接把服务器拖垮。 最近我从0到1实现了一个高性能内存池,经过严格的压测验证,在8B到2048B的分配释放场景下,性能相比传统的ma…...

LDPC 码 BP 算法性能研究

1. 要点来源:NASA 技术报告 + IEEE 802.16e 标准矩阵 算法:经典 Belief-Propagation(BP)迭代解码 + 最小和(MS)变体 性能:BER vs Eb/N0、迭代次数、码长/码率影响、BP vs MS 对比 输出:BER 曲线图、迭代收敛图、误码位置分布2. 结构 LDPC_BP_Study/ ├── main_…...

内外网文件传输方式有哪些:从传统方案到专业系统的全面解析!

在数字化时代,企业数据流通需求日益增长,许多企业为保障核心数据安全实施网络隔离,由此催生了内外网文件传输的高频场景。内外网文件传输指在企业内部网络与外部网络(或不同安全域隔离网络)之间,实现文件数据流通的行为,其核心诉求是在突破网络连接限制的同时,兼顾安全…...

实用指南:DeerFlow 实践:华为IPD流程的评审智能体设计

实用指南:DeerFlow 实践:华为IPD流程的评审智能体设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

py之补环境代理脚本

function getEnvs(proxyObjs) {for (let i = 0; i < proxyObjs.length; i++) {const handler = `{get: function(target, property, receiver) {console.log("方法:", "get ", "对象:", "${proxyObjs[i]}", " 属性:", …...

Python psutil模块

一、简介psutil(Process and System Utilities)是Python中最强大的系统监控和进程管理库之一。它提供了跨平台的系统信息获取接口,能够轻松获取系统的CPU、内存、磁盘、网络等硬件信息,以及进程管理、系统监控等功能。无论是开发运维工具、系统监控程序,还是性能分析应用,…...

跨网文件传输工具选择要点是什么?

内容概要 在选择跨网文件传输工具时,企业面临着诸多考量。本文旨在全面剖析“跨网文件传输工具如何选择”的关键要素,特别是聚焦于像Ftrans Ferry跨网文件安全交换系统这样的专业解决方案。以下将从安全性、功能特性、易用性及扩展性四大维度出发,通过具体分析和实例,为您提…...

下半年业绩冲刺,12个效率工具帮你提速!

三季度收尾在即,距离 2025 年结束只剩 3 个月,你的业绩目标还差多少? 如果进度滞后,四季度的冲刺就得靠 “巧劲”—— 别只拼时间,多借工具的力。就像我一位朋友,刚工作时同事还在手写记录、靠电话找信息,他早早用电脑打字、上网查资料,效率直接领先一截。古人说 “君子…...

AUTOSAR的MPU内存保护

AUTOSAR的MPU内存保护Q:How can I configure MPU(Memory Protection Unit) for an OS_Task in Vector AUTOSAR Conguration Tool? A:For a configured task, you configure OsTaskMemoryProtectionIdentifier to specify a memory protection identifier for the task. you …...

AI赋能CRM:纷享销客智能图像提升终端运营效率

在消费品行业竞争日益白热化的当下,终端已成为品牌竞争的核心战场。门店陈列是否规范、数据是否真实、执行是否合规,让诸多企业陷入“看不见、管不清、控不住”的终端管理困境。 面对这一核心痛点,纷享销客推出全新升级的纷享 AI 图像智能,以 AI 技术重新定义终端管理模式。…...

【linux命令】网卡命令 ①

网卡命令 ifup / ifdown功能:启用或关闭网络接口。 依赖配置文件:在 RHEL/CentOS 系统,读取 /etc/sysconfig/network-scripts/ifcfg-*。用法: ifup eth0 # 启用 eth0 ifdown eth0 # 关闭 eth0限制:如果没有写配置文件,会提示 not configured,所以更偏向于系统初…...

一款基于 .NET 开源美观、功能丰富的串口调试工具

前言 今天大姚给大家分享一款基于 .NET 开源(GPL-3.0 license)、美观、流畅、高效、功能丰富的串口调试工具:SuperCom。 工具介绍 SuperCom 是一款基于 .NET 开源(GPL-3.0 license)、美观、流畅、高效、功能丰富的串口调试工具,主要用于 Window 串口日志的采集、存储、可…...

麒麟系统中docker常用命令

检查 docker 服务是否已启动 sudo systemctl status dockersudo systemctl start docker # 启动 sudo systemctl enable docker # 设置开机自启 sudo systemctl restart docker #重启docker查看 docker 镜像和容器docker images # 列出本地所有镜像 docker…...

2015年7月微软安全更新深度解析:SQL Server、IE及系统漏洞修复

微软2015年7月发布14项安全更新,含4项紧急补丁,涉及SQL Server远程代码执行、IE浏览器漏洞、Hyper-V虚拟化风险等关键技术领域,同时提供Windows Server 2003最终安全更新和恶意软件清除工具增强。2015年7月安全更新概要 2015年7月15日(日本时间),微软发布14项新安全公告(…...

国产传输软件解决方案厂商优选指南

内容概要 在当今数字化时代,选择合适的国产传输软件解决方案厂商对于企业的信息安全与业务效率至关重要。众多厂商中,国产传输软件解决方案厂商以其专业实力脱颖而出,其中Ftrans SFT文件安全传输系统‌备受瞩目。本指南旨在通过深入分析厂商的全面适配信创生态能力、解决方案…...

安卓方程式计算器HiPER Calc PRO v11.2.7 高级版

HiPER Calc Pro(原应用名称HiPER Scientific Calculator高级版),一款收费非常好用且无广告功能强大的方程式图形计算器,分数计算器,代数计算器,矩阵计算器,具备完整图形、算术方程式、表格、常数、函数强大功能。它多包含100位有效数字和9位小数,支持检测重复的小数,并…...

.NET 10 是微软 AI 战略的技术承重墙

微软于2025年1月成立的新部门 CoreAI - Platform and Tools(简称CoreAI),是其AI战略升级的核心举措,旨在整合内部资源、加速AI基础设施与工具开发,推动“以模型为中心”的应用变革。CoreAI是微软AI战略的“中枢神经”,通过整合开发工具、云平台与研究资源,构建覆盖全场景…...

在Oracle中,如何彻底停止expdp进程?

许多同事在使用expdp命令时,不小心按了CTRL+C组合键,然后又输入exit命令(或者网络中断等异常现象),导致expdp进程不存在,但Oracle数据库的会话仍存在,所以dmp文件也一直在增长。在这种情况下的处理办法如下所示: 1、检查expdp进程是否还在 ps -ef | grep expdp 若存在,…...

[SDR] 两种方法可视化打飞机:ADS-B 信号接收与航班追踪

目录效果展示一、前言二、gr-air-modes2.1 环境构建2.2 经典案例效果展示一、前言介绍ADS-B协议和1090MHz频段。 使用USRP和dump1090等工具接收和解码航班信息。 在地图上实时显示航班位置。二、gr-air-modes gr-air-modes 是一个开源的软件定义无线电(SDR)接收器,用于解析飞…...

P7072 [CSP-J2020] 直播获奖

P7072 [CSP-J2020] 直播获奖#include <bits/stdc++.h> using namespace std;const int maxn = 1e5 + 10; int n,w,cnt[610] = { 0 };int main(){ios::sync_with_stdio(0);cin.tie(0);cin >> n >> w;int ans = 1;for(int i = 1; i <= n; i++){int t;cin &g…...

服务器文件同步工具大盘点

内容概要 在数据驱动的时代,服务器文件同步成为企业日常运营不可或缺的一环。面对繁多的文件同步需求,“服务器文件同步工具有哪些”成为众多IT管理者关心的焦点。本文将全面盘点当前主流的服务器文件同步工具,特别介绍如Ftrans FTC文件传输管控系统等高效解决方案。它们凭借…...

基于Python+Vue开发的酒店客房预订管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的酒店客房预订管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的酒店客房预订管理系统项目,大学生可以在实践…...

AI破局俱乐部,通过AI搞副业,确实解决了很多人中年危机问题

前段时间“李一舟”事件炒得沸沸扬扬,有的人悲愤不已,有的人拍手叫好。割韭菜的情景,就如你满怀期待地报班学一门课程,结果发现所谓的“秘籍”不过是些网上随处可见的常识。又如你兴冲冲地去吃大餐,结果端上来的却是昨天的剩饭。这种“割韭菜”的套路,简直就是在考验我们…...

深入剖析布谷im即时通讯app系统软件源码之技术

随着互联网的发展,企业和个人对即时通讯(IM)应用的需求日益增长。山东布谷鸟网络科技有限公司深入了解市场与用户需求,专注于即时通讯app系统的开发,提供包括源码交付的完整解决方案,助力客户快速搭建安全、稳定且高效的IM平台。 山东布谷科技将从软件开发的多个维度,详…...

解锁RAG高阶密码:自适应、多模态、个性化技术深度剖析

别让你的AI系统还停留在只会查字典的阶段!本文用轻松幽默的方式揭秘高级RAG技术如何让AI变得更聪明:自适应检索像读心术一样精准,多模态RAG让AI能看图识字,个性化RAG则让AI记住你的每一个小习惯。想打造真正智能的AI应用?这三项技能缺一不可!当你走进一家智能咖啡厅,第一…...

低延迟垃圾收集器:挑战“不可能三角”

----------- 先赞后看 👍 效果翻倍 🔥 ---------------- 在开始之前,必须再次强调 “不可能三角”:内存占用、吞吐量、延迟,三者难以同时完美。 传统的垃圾收集器(如 Serial, Parallel, CMS, G1)在堆内存变大时,停顿时间(Latency)也会显著变长,因为它们总有一些阶…...

Java Heap Dump详解

1、什么是 Heap dump? Java堆转储(Heap Dump)是Java虚拟机(JVM)在某一时刻内存使用情况的快照,它包含了该时刻所有对象的实例信息、类信息、字段值和引用关系等数据。堆转储文件通常以 .hprof或 .heap为扩展名,是诊断内存问题的关键工具。 当应用程序出现内存泄漏、内存…...

软件逆向入门理论

软件逆向入门理论目录大脉络软件的构成软件逆向是一种技术手段,它能达成的目的:分析该软件的漏洞; 分析这个软件,想作为跳板获取其他软件、系统的更高权限; 分析该软件的安全性、可靠性等; 分析该软件的构成;下面粗浅的进行软件逆向入门,将选择经典的x86平台下的软件来…...

鸿蒙应用开发从入门到实战(七):ArkTS组件声明语法

《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,陆续更新AI+编程、企业级项目实战等原创内容、欢迎关注!​本文从界面制作从组件声明开始,通过一个相对简单的案例来系统的学习 ArkTS 声明组件的语法。大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发…...

P1115 最大子段和

P1115 最大子段和 妙#include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 2e5 + 10;int n,a[maxn],dp[maxn]; int ans = -100010;signed main(){// freopen("in","r",stdin);ios::sync_with_stdio(0);cin >&g…...

麒麟系统关闭防火墙

有时远端连接数据库时出现 连接超时 ,则有可能是 麒麟系统的防火墙 开启了,最简单的方法是关闭防火墙#查看防火墙状态 sudo systemctl status firewalld #检查 firewalld 是否运行 #或 sudo systemctl status ufw #检查 ufw 是否运行 (部分系统适用)#临时停止防火…...

P14003 [eJOI 2025] Reactions 解题报告

题目意思 随便找的题目,树状数组和离散化,很板子的东西不会细说 给定两个数组 \(D_i,T_i\),求 \(\max\limits_{i=1}^{n}{(\sum\limits_{j=i}^n[\sum\limits_{k=i}^jD_k \ge T_j])}\)。 思路 首先如果你将上面那个式子分解或者稍稍理解一下就能想到将区间加和,区间问题转化为…...

计算机科学入门

计算机科学入门 总结:知识点体系图 graph TDA[C++基础知识点] --> B[计算机发展史]A --> C[操作系统]A --> D[硬件组成]A --> E[编程语言与开发]A --> F[基本操作]B --> B1[重要人物:图灵/冯诺依曼]B --> B2[历史里程碑:ENIAC/103机]B --> B3[奖项:…...

Windows Server 2019开启远程桌面无法远程处理

故障现象 Windows Server 2019开启了远程桌面但是无法远程 Telnet对应端口3389也不通 故障原因 远程服务Down了 修复 到服务管理重启远程服务Remote Desktop Service如果提示病毒则关闭本机自带杀毒...

英语_阅读_This makes me crazy_待读

My parents know little about high-tech products. 我的父母对高科技产品几乎一无所知。 Computers, mobile phones, iPads ... They cant use any of them! 电脑、手机、平板……他们一个都不会用! Every time Im home for a holiday, my parents ask me how to take a phot…...

一位华裔数学家40年目睹之怪现状:美国学生的数学为什么那么差?

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087最近在《知识分子》上读到一篇特写《数学战争警示录:我们需要什么样的数学教育?》,颇有感触。在这俄乌战争已持续三年有余、…...

这些年轻科学家不再满足于“追赶美国”

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选)在很长一段时间里,硅谷是全球AI人才的终点站。而中国曾是最大的人才输出地,把一代又一…...

英语_阅读_

My parents know little about high-tech products. 我的父母对高科技产品几乎一无所知。 Computers, mobile phones, iPads ... They cant use any of them! 电脑、手机、平板……他们一个都不会用! Every time Im home for a holiday, my parents ask me how to take a phot…...

聊聊理想的影像团队

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087这实际上是一个招聘贴,期望能捞一些理念相同的同道中人,一起做一些事情,为视觉中枢在 AI 浪潮里留下点什么,为 AI 做出点什…...

黑芝麻智能上半年亏损超7亿 CEO单记章去年薪酬高达1.66亿

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087 添加图片注释,不超过 140 字(可选) 添加图片注释,不超过 140 字(可选)国内“智驾芯片第一股”黑芝麻智能国际控股有限…...

英语_阅读_BMI_待读

56. What is Chinas recent success in BMI? 中国在脑机接口方面最近的成功是什么? A paralyzed patient was able to drink water by controlling a glove with his brain. 一位瘫痪患者能够通过用大脑控制手套来喝水。57. What is the external device in the recent exper…...

Flutter数据可视化:fl_chart图表库的高级应用

Flutter数据可视化:fl_chart图表库的高级应用本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨如何使用fl_chart构建美观、交互式的财务数据可视化图表。项目背景 BeeCount(蜜蜂记账)是一款开源、简洁、无广告的个人记账应用。所有财务数据完全由用户掌控,支持本地存…...

教材大纲-Python

版本一:教材大纲-Python 1 编程世界初探 1.1 编程世界初探 1.2 初识Python语言 1.3 迈出Python编程的第一步 2 走近算法与Python基础 2.1 走近算法:流程图 2.2 触摸生活中的标志:turtle 2.3 初探Python基础知识:常见数据标识与语句 2.4 体会程序编写规范:命名与注释 3 Pyt…...

2025 年 PHP 常见面试题整理以及对应答案和代码示例

2025 年 PHP 常见面试题整理以及对应答案和代码示例 PHP 面试通常会考察基础知识(数组、OOP、错误处理)和现代特性(类型、属性、枚举)。关键是要展示你能写出简洁、可预测的代码,同时了解 PHP 8+ 的新变化。 我整理了以下一些常见 PHP 可能面试的。每个问题都有简洁的答案…...

0130_中介者模式(Mediator)

中介者模式(Mediator) 意图 用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 UML 图优点降低耦合度:将对象间的一对多关联转变为一对一的关联,减少对象间的依赖 集中控制:将交互逻辑集…...

零门槛入局 AI 创业!瓦特 AI 创作者平台,让普通人轻松抓住风口

刷短视频时,总被 AI 生成的炫酷图片、洗脑音乐吸引;和朋友聊天,大家都在热议 “AI 变现”—— 你是不是也想搭上这波 AI 浪潮,却总被 “要懂技术”“需复杂开发” 拦住脚步?别担心,瓦特 AI 自媒体创作者平台早已为普通人铺好赛道:无需技术基础、一键部署专属平台,轻松拥…...

基环树

一.首先定义看定义 树是N个点N-1条边的联通图 基环树是N个点N条边的连通图 不保证联通就都是森林 所以基环树就是在树上加了一条边,使得树上有了一个环 基环树的常见处理方法把环上的一条边单独处理, 这样其余部分依然是一棵树 把环单独处理, (缩成一个点)这样其余部分依然…...

2025介绍1个简单好用免费的版权符号复制生成网站

最近安装了claude code,这编程真是很爽啊,直接把需求告诉他就行了,很快,已经彻底放弃cursor啦!顺便做了个复制版权符号的网站https://copyrightsymbol.app 一句话介绍网站: 复制版权符号,和版权符号相关的一切小功能,免费无登录 网站地址: https://copyrightsymbol.ap…...

【GitHub每日速递 250917】69k 星标!这个 MCP 服务器大集合,竟能解锁 AI 无限可能?

原文:【GitHub每日速递 250917】69k 星标!这个 MCP 服务器大集合,竟能解锁 AI 无限可能?爆火!garak——大语言模型漏洞扫描神器全揭秘 garak 是一个用于检测大语言模型漏洞的扫描工具。简单讲,它能自动发现AI模型中的安全弱点和潜在风险。适用人群:AI安全研究人员、模型…...

WPF 通过 WriteableBitmap 实现 TAGC 低光增强效果算法

我在寻找将一些拍摄出来的比较暗的图片进行光亮增强的算法,用于处理我出门拍的一些照片。我从博客园找到了 Imageshop 大佬记录的伊拉克团队的TAGC(低光增强效果)算法实现,通过阅读大佬的博客和对应的论文,基于 WPF 的 WriteableBitmap 实现 TAGC 低光增强效果算法开始之前…...