- 博客(50)
- 收藏
- 关注
原创 内存池优化高频内存操作性能
内存池技术通过预先分配大块内存、复用已释放对象和减少系统调用,显著提升了在频繁分配和释放内存场景下的性能。其核心优势在于避免了默认内存管理函数(如mallocfreenewdelete)的通用性开销,从而带来更快的分配速度、更低的内存碎片化以及更好的内存局部性。内存池在程序初始化或首次需要时,一次性向操作系统申请一大块连续内存。这,极大地减少了系统调用的次数和锁竞争的开销。经典内存池(如固定内存池)专为分配设计。它将预先申请的大内存块划分为等大的“节点”(Node),并用一个将所有空闲节点串联起来。
2026-04-06 00:21:57
379
原创 C++类型限定符
const修饰的对象/变量只读,编译器会禁止对其进行修改操作,本质是“告诉编译器该变量的值不应被修改”,若强行修改会触发编译错误(除非通过未定义行为绕过)。volatile告诉编译器:该变量可能被程序外部的因素修改(如硬件寄存器、多线程、信号处理函数),编译器禁止对该变量进行优化,必须每次从内存读取其值(而非缓存到寄存器)。restrict修饰的指针是“受限指针”,告诉编译器:该指针是访问其指向内存区域的唯一方式,编译器可基于此进行优化(如消除冗余的内存访问)。mutable。
2026-03-20 17:09:36
386
原创 std::unique_lock 与 std::lock_guard
导致的锁泄漏(如异常时未解锁),但二者在灵活性、性能、适用场景上有显著差异。的锁管理器,设计目标是“最简单的锁管理”。的所有功能,还扩展了更多高级特性。都是 C++ 标准库提供的。,核心目的是避免手动调用。
2026-03-20 17:07:32
437
原创 C++:迭代器失效
迭代器失效定义:迭代器指向的内存/元素位置非法,操作该迭代器触发未定义行为;失效核心原因:容器内存重分配(vector扩容)、元素位置移动(vector插入)、元素删除;关键解决方案顺序容器(vector/deque):用的返回值更新迭代器;关联容器(map/set):删除前保存下一个迭代器,仅失效被删迭代器;避免复用修改操作后的旧迭代器。
2026-03-18 21:46:12
416
原创 vector的push_back和emplace_back核心区别
对于需要多参数构造的自定义类型,:构造临时Person → 移动构造到vector → 析构临时对象;:直接在vector中构造Person,仅1次构造,无额外开销。核心差异push_back插入“已构造的对象”(有拷贝/移动开销),接收“构造参数”原地构造(无临时对象);性能:自定义类型(多参数构造)下更优,简单类型/已有对象两者无差异;使用原则:C++11+优先用,插入已有对象时push_back语义更清晰。
2026-03-18 16:31:28
387
原创 C语言函数调用的流程
以栈地址(高→低)内容访问方式(EBP偏移)高地址被调函数参数2(20)ebp+12被调函数参数1(10)ebp+8返回地址ebp+4主调函数EBP值ebp被调函数局部变量ebp-4(示例)低地址ESP指向栈顶核心流程:参数压栈→保存返回地址→构建被调函数栈帧(压栈EBP、设置EBP)→执行函数逻辑→保存返回值→销毁栈帧→返回主调函数;关键寄存器:EBP/RBP(栈帧基址)、ESP/RSP(栈顶指针)、EIP/RIP(指令指针)、EAX/RAX(返回值传递);核心规则。
2026-03-17 21:10:20
418
原创 C++:RTTI运行时类型检查
C++是静态类型语言(编译期确定类型),而RTTI打破这一限制:程序运行时,能通过基类指针/引用,获取其指向的实际派生类对象的类型信息(如类名、继承关系)。RTTI 核心机制仅对含虚函数的类生效,依赖虚函数表中的type_info指针(VS虚表-1位置,GCC虚表0位置);(类型转换+校验)、typeid(获取类型信息);关键特性可通过编译器参数(-fno-rtti/GR-)关闭,减少体积/提升性能;开销高于typeid,高频场景需谨慎;最佳实践。
2026-03-17 14:32:07
310
原创 C++ 隐式类型转换全解析
参考回答提到“单个参数的构造函数可自动生成临时对象”,这是自定义类型隐式转换的核心场景,也称为“用户定义的转换”。// 隐式转换:10→MyInt(10),返回true// 看似简洁,但易误写:if (10 == m) 也成立,逻辑不直观return 0;核心分类内置类型:低精度→高精度的安全转换(如int→double),反向转换易丢失精度;自定义类型:单参数构造函数触发的隐式转换(可通过explicit禁用);关键控制单参数构造函数加。
2026-03-17 13:54:43
194
原创 C++ 常量的定义方式与内存存储位置全解析
这是最常用的方式,参考回答中的“top-level const”即此类(const修饰整个对象,而非指针/引用的底层数据)。常量定义方式const(运行期只读)、constexpr(编译期常量);#define(预处理替换,不推荐)、枚举常量;规则:const/constexpr常量定义时必须初始化。内存存储位置局部const常量:默认栈区,编译期常量可能优化为立即数;全局/静态const常量、字符串字面量:常量区(.rodata,只读);
2026-03-16 22:18:50
372
原创 C++ 实现main函数执行前运行代码的全方案
除了手动实现的函数,程序自身的以下逻辑也会在main全局/静态变量的初始化内置类型全局变量(如)的赋值;自定义类型全局对象的构造函数(核心方案2);编译器扩展标记的函数修饰的函数(参考回答方案);修饰的函数指针;CRT初始化函数如atexit注册的函数(虽在main后执行,但初始化逻辑在main前);动态库的初始化函数(_initDllMain静态全局变量的初始化函数如string的构造函数在main前执行。实现方式编译器扩展:GCC用,Windows用__declspec;
2026-03-16 21:45:14
341
原创 C++:static
全局变量/函数static限制作用域为当前文件,避免命名冲突,链接属性变为内部链接;局部变量static使其存储在数据段,生命周期延长至程序结束,仅初始化一次;类成员静态变量:类外初始化,所有对象共享,无 this 指针;静态函数:无 this 指针,仅访问静态成员,可直接通过类名调用;扩展用法编译期断言,静态嵌套类型;核心本质static的核心是“作用域限制”和“生命周期延长”,不同场景下的表现均围绕这两个核心。
2026-03-16 17:10:07
405
原创 C++:纯虚函数,虚函数与多态
纯虚函数是在虚函数声明后加= 0class 类名 {public:// 纯虚函数:无函数体,=0 表示“纯虚”virtual 返回值类型 函数名(参数列表) = 0;// 抽象类:包含纯虚函数public:// 纯虚函数:计算面积(无实现)// 普通成员函数(抽象类可包含普通函数)// 错误:抽象类无法实例化// Shape s;// 编译报错:cannot declare variable 's' to be of abstract type 'Shape'
2026-03-13 14:21:01
598
原创 C++:fork()函数
fork()是Unix/Linux下创建子进程的核心系统调用,调用一次返回两次(父进程返回子PID,子进程返回0);核心特性包括写时复制、执行流并行、资源继承(文件描述符)与私有(内存);使用时需注意回收子进程资源(避免僵尸进程)、区分父子执行逻辑、处理进程间通信需求。
2026-03-12 16:57:44
297
原创 C++函数指针
函数在内存中会占用一段连续的代码空间,其入口地址(函数名本身就是该地址)可被指针存储——这个指针就是“函数指针”。普通指针:指向数据(如int*指向int变量);函数指针:指向函数(如指向“无返回值、参数为int的函数”)。函数指针的定义需严格匹配目标函数的返回值类型和参数列表// 通用格式返回值类型 (*指针变量名)(参数类型1, 参数类型2, ...);// 示例:指向“返回int、参数为两个int”的函数的指针函数指针语法冗长,可通过typedef或using。
2026-03-12 15:53:00
213
原创 C++:vector
核心特性:连续内存、随机访问(O(1))、动态扩容(翻倍策略),适合频繁读取、尾部增删的场景;性能优化:提前reserve避免频繁扩容,优先用替代push_back(减少拷贝);安全访问:用at()替代[]做越界检查,空vector避免调用front()back();常用操作:尾部增删(push_backpop_back)、迭代器遍历、排序/查找(结合STL算法)是高频操作;内存管理clear()仅清空元素不释放内存,swap空vector可释放内存。
2026-03-10 20:03:56
449
原创 C++:priority_queue
(优先队列)是 C++ STL 中的适配器容器(基于其他容器实现),本质是一个「堆结构」——队列中的元素会按照优先级自动排序,而非按插入顺序。每次访问/弹出的都是优先级最高的元素(默认是最大值,可自定义为最小值);底层实现:默认基于,也可指定std::deque(不支持std::list,因为堆需要随机访问);头文件:必须包含<queue>。默认的需重载比较运算符(operator<),或自定义比较函数。#include <functional> // 需包含(for function)
2026-03-10 13:23:37
572
原创 C++网络:一
基础分层模型:OSI七层是理论参考,TCP/IP四层(五层)是实际工业标准,前者用于理解原理,后者用于实际实现;传输层模型:TCP(面向连接、可靠)vs UDP(无连接、高效),按需选择(Web用TCP,直播用UDP);专用场景模型:HTTP是应用层请求-响应模型(Web核心),P2P是去中心化模型(文件共享/区块链核心);选型原则追求可靠性→TCP/HTTP;追求实时性→UDP;追求去中心化/扩展性→P2P;学习/排障→OSI七层/五层TCP/IP。
2026-03-09 17:07:02
433
原创 C++虚析构函数
虚析构函数是指在基类中通过virtualpublic:virtual ~Base() { // 虚析构函数// 基类资源释放逻辑其核心特性是:当通过基类指针/引用删除/销毁派生类对象时,C++ 会根据对象的实际类型(而非指针类型),从派生类到基类逐层调用析构函数,而非仅调用基类析构函数。核心要点说明定义基类中用virtual声明的析构函数,支持多态析构核心用途1. 确保派生类析构函数被调用,释放自身资源;2. 防止内存/资源泄漏未使用的风险。
2026-03-07 20:28:59
393
原创 正则表达式
通过预定义的语法规则描述字符串的特征,用于快速检索、替换、验证符合特定规则的文本(如邮箱、手机号、URL等)。正则表达式(Regular Expression,简称Regex/RE)是一种。C++11 及以上标准提供了。
2026-03-07 15:54:06
576
原创 C++运行时内存空间
C++ 内存核心分为栈、堆、全局/静态区、常量区、代码区,其中栈和堆是程序员最需要关注的区域;栈由编译器自动管理,易出现栈溢出;堆需手动管理,易出现内存泄漏,推荐用智能指针;全局/静态区变量生命周期贯穿程序全程,滥用会增加代码耦合;常量区只读,修改会崩溃;理解内存区域是解决内存问题的核心,比如“返回栈变量指针”“野指针”“内存泄漏”都和内存区域的生命周期直接相关。
2026-03-06 17:52:14
385
原创 C++四个智能指针
智能指针的核心价值是自动管理内存,解决裸指针的内存泄漏、野指针等问题;unique_ptr是首选(独占、高效),shared_ptr用于共享场景,weak_ptr解决循环引用;auto_ptr已废弃,切勿使用;本质是 RAII 机制:把内存释放逻辑封装到析构函数,利用 C++ 自动调用析构的特性,实现“不用手动释放”。
2026-03-06 17:41:10
463
原创 const_cast正确用法与风险规避
技术层面的未定义行为机制// 真正的const对象// 危险操作:尝试修改const对象// 未定义行为(UB)// 可能的运行时表现:// 1. 程序崩溃(如果immutable位于只读内存页)// 2. 值不变(编译器优化假设immutable永远不会改变)// 3. 其他内存损坏(破坏相邻变量)从编译器优化角度分析,现代编译器基于"as-if规则"和"严格别名规则"进行激进优化。将值直接硬编码到指令中假设该对象在整个生命周期内保持不变将该对象放置在只读内存段。
2026-02-26 00:06:30
289
原创 C++线程锁
基础锁std::mutex是核心,递归场景用,超时场景用;RAII封装lock_guard(C++17+);(灵活、支持条件变量/超时);特殊场景;call_once;核心原则:永远用RAII封装管理锁,避免手动lock()unlock(),防止死锁。
2026-01-22 18:13:19
728
原创 C++类成员指针
/ 格式:类名::* 指针变量名类型 类名::* 数据成员指针名 = &类名::数据成员名;// 格式:返回值 (类名::*)(参数列表) [const/volatile]返回值 (类名::* 函数指针名)(参数列表) [const] = &类名::成员函数名;成员指针本质:存储类成员的偏移量,而非直接内存地址,必须绑定对象才能访问/调用;语法关键:数据成员指针用类名::*,成员函数指针需匹配返回值/参数/const限定,调用用.*->*;可调用对象适配:优先用lambda表达式。
2026-01-10 16:14:16
873
原创 C++虚继承
核心目的:虚继承是C++解决多重继承中菱形继承问题的专属机制,通过让共同基类成为虚基类,保证其在最终派生类中仅存在一份实例,消除数据冗余和访问二义性;核心规则:虚基类的构造函数由最终派生类统一初始化,中间基类对虚基类的初始化会被忽略;使用场景:仅在遇到菱形继承时使用,避免滥用(可优先考虑组合/接口替代多重继承);易混点:虚继承≠虚函数,前者解决继承冗余,后者实现多态,底层机制不同但都依赖编译器的隐藏指针和表。
2026-01-09 18:07:46
1041
原创 C++异常对象
核心本质:异常对象是运行时在专用存储区创建的临时对象,承载异常信息,生命周期由异常处理机制管理,与栈/堆无关;捕获原则:优先使用引用捕获(无拷贝、支持多态),避免值捕获导致的切片和性能开销;重新抛出:用throw;保留原异常对象,禁止throw e;(会创建新拷贝、丢失多态);避坑要点:绝对不要抛出局部对象的引用/指针,防止悬垂引用;优先使用继承的类作为异常对象。
2026-01-07 20:31:04
890
原创 多重继承与虚继承
多重继承:允许一个类继承多个基类,复用多类特性,但会引发菱形继承的数据冗余和二义性问题;虚继承:通过virtual关键字声明继承,将共同基类变为虚基类,使其在最终派生类中仅保留一份实例,解决菱形继承的核心问题;关键规则:虚基类的构造函数由最终派生类统一初始化,中间基类对虚基类的初始化会被编译器忽略。
2026-01-06 21:53:32
443
原创 C++线程池
线程池核心是「任务队列+工作线程+同步机制」,通过复用线程避免频繁创建/销毁的开销;线程管理的关键:创建:构造函数中初始化工作线程,绑定核心循环函数;复用:线程循环从任务队列取任务执行,无任务时休眠,有任务时被唤醒;退出:析构时标记状态、唤醒所有线程、等待线程执行完当前任务后join;线程安全:通过互斥锁保护任务队列,条件变量实现等待/唤醒,while循环避免虚假唤醒。基础版线程池的代码可以直接编译运行(C++11及以上),是理解线程池原理的核心模板;
2025-12-31 13:41:28
793
原创 C++数据库操作
C++操作MySQL依赖,核心是通过MYSQL句柄管理连接,执行SQL;增删改操作直接执行SQL,通过获取影响行数;查询操作需通过获取结果集并逐行解析;关键注意事项:必须初始化/释放MySQL库资源,避免内存泄漏;设置字符集防止中文乱码;生产环境用预处理语句防SQL注入;每个API调用后检查返回值,通过排查错误。
2025-12-31 13:05:24
784
原创 std::bind()
std::bind是函数适配器,核心是通过“柯里化”绑定函数参数,生成新的可调用对象;底层原理:绑定器对象存储原函数和参数(固定值/占位符),重载operator()解析参数并转发给原函数执行;关键细节:占位符用于映射调用时的参数,成员函数绑定需处理this指针,完美转发保证参数传递的正确性。简单来说,std::bind的本质就是“封装+参数解析+转发”——把原函数和参数封装成新对象,调用时解析参数并转发执行。
2025-12-30 21:29:04
1047
原创 深拷贝、浅拷贝
浅拷贝是C++编译器默认生成的拷贝行为:仅复制对象的「栈上成员」(包括指针变量的地址值),不复制指针指向的「堆内存资源」。新对象和原对象共享同一块堆内存,相当于“多个管家管同一个房子”。深拷贝需要手动实现:不仅复制对象的栈上成员,还会为新对象重新分配一块独立的堆内存,并将原对象堆内存中的内容完整复制过去。新对象和原对象拥有完全独立的堆资源,相当于“复制房子的所有内容,盖一栋新的一模一样的房子”。核心区别。
2025-12-27 20:06:56
367
原创 RAII机制
RAII 是的缩写,翻译为“资源获取即初始化”。它的核心逻辑可以用一句话概括:将资源的生命周期与对象的生命周期绑定——在对象构造时获取资源,在对象析构时自动释放资源(无论程序正常执行还是抛出异常,析构函数都会被调用)。内存(newdeletemallocfree文件句柄(fopenfcloseopenclose线程同步资源(互斥锁lockunlock、条件变量);网络/数据库连接(connectdisconnect线程(joindetach,你之前问过的就是RAII的典型)。
2025-12-27 14:03:24
746
原创 C++类型定义
类是C++实现封装、继承、多态的核心语法,本质是「用户自定义的复合类型」,将数据(成员变量)和操作数据的行为(成员函数)封装在一起,通过访问控制(public/private/protected)控制外部对内部成员的访问。// 类的定义:封装“人”的属性和行为private: // 私有成员:仅类内访问(数据隐藏)int age;public: // 公有接口:外部可访问// 构造函数:初始化对象// 成员函数:操作私有数据。
2025-12-26 17:44:11
796
原创 C++文件类型
/ demo.cpp —— 源文件:实现#include "demo.h" // 包含头文件,获取声明// 函数定义(具体实现)// 类成员函数实现// demo.h —— 错误示例:头文件中定义全局变量// 外部链接,多个.cpp包含会导致“多重定义”// 正确做法:头文件声明,源文件定义// demo.h// 声明// 定义核心分工:.h/.hpp是「接口声明」(告诉编译器“有什么”),.cpp/.cc是「实现定义」(告诉编译器“怎么做”);编译单元。
2025-12-26 14:28:12
664
原创 编译-链接:内部链接、外部链接
外部链接的符号整个程序只能有一个定义// 定义// 重复定义 → 链接错误:multiple definition of `global_var`特性外部链接内部链接可见范围全程序所有目标文件仅当前目标文件同名符号冲突程序内不能同名定义多目标文件同名无冲突核心关键字extern(显式声明)static、匿名命名空间典型场景跨文件共享的变量/函数仅当前文件使用的工具函数/变量。
2025-12-25 14:06:37
800
原创 C++,声明和定义,二
绝大多数声明会同时完成定义,只有这5种情况,声明仅仅是「声明」,不会成为「定义」。解释:静态类数据成员属于「类级别的资源」,而非对象级,类内仅能声明,不能分配内存(定义),必须在类外单独定义(C++17前)。例子:class A {// 仅声明:告诉编译器A有个静态成员x,但不分配内存// 定义:为x分配内存并初始化,这才是真正的定义(C++17后可加inline,此时类内既是声明也是定义)绝大多数定义本身也是声明。
2025-12-24 20:29:09
923
原创 Union,Struct,Class的异同点
类型核心优势核心限制核心语义union内存极致节省仅存一种类型、无继承互斥数据存储struct数据聚合、C 兼容无封装语义(规范层面)纯数据集合class封装、继承、多态无 C 兼容面向对象的完整对象存互斥数据、省内存 →union;存纯数据、无行为 →struct;做封装、写逻辑 →class。
2025-12-10 13:16:22
770
原创 C++,定义和声明
语义:向编译器 “介绍” 一个标识符(变量、函数、类、模板等)的存在,说明其「类型 / 接口」,但不分配内存不提供具体实现;核心作用:告诉编译器 “这个东西在程序的某个地方(可能是当前文件、其他文件)存在,你先认识它,不用管它具体在哪 / 怎么实现”;次数限制:同一个标识符可以多次声明(只要声明的类型 / 接口一致);关键规则:声明不触发 ODR(单定义规则),仅用于 “让编译器识别标识符”。语义:为标识符分配内存(变量)或提供具体实现(函数 / 类),是标识符的 “实体落地”;核心作用。
2025-12-08 20:51:14
1014
原创 offline RL:IQL
CQL:明确的 pessimism(对 OOD 动作惩罚),理论保障强,适合数据覆盖差时保证安全,但对训练数据内的腐败/噪声敏感并且超参数敏感性高。IQL:把策略问题转为受 value 指导的监督学习,训练稳定、工程实现友好,通常在噪声数据或需要稳定复现实验时表现更好;但对 Q-target 的 heavy-tail(如 dynamics corruption)敏感,需要与鲁棒统计或不确定性方法(如 Huber、quantile ensemble)配合使用以增强鲁棒性(RIQL)。
2025-12-08 20:40:30
1137
原创 offline RL:一
特性DQN (离线直接用)CQLFQE (评估用)目标 (Target)rγmaxQs′⋅rγmaxQs′⋅rγmaxQs′⋅rγmaxQs′⋅rγQs′πevals′rγQs′πevals′))动作选择 (Target)选择 Q 值最大的动作 (Argmax)选择 Q 值最大的动作严格遵循待评估策略πeval\pi_{eval}πeval损失函数MSE。
2025-12-04 17:49:18
751
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅