- 博客(60)
- 收藏
- 关注
原创 C++ 中模板元编程与 SFINAE 机制
用模板来进行编译器计算,运行期直接把结果替换到代码内,如编译器进行斐波那契数列计算,编译器判断是否指针类型;// 特化编程,设置边界return 0;
2025-11-05 16:23:26
341
原创 0基础学舞蹈,学习计划
第 2 周 身体分离度(肩胸 + 胯部)+ 爵士步 能做到 “手动胯不动”,爵士步走得轻盈,顶胯有力度。第 1 周 热身 + 核心控制 + 简单顶胯 / 踏步 核心能收紧,顶胯、踏步不晃,能踩准慢节奏鼓点。第 3 周 动态核心 + 侧滑步 + 卡点停顿 转体、跳跃时核心不塌,侧滑步流畅,能精准停在重拍。小碎步:原地快速小踏步,膝盖微屈,核心收紧(1 分钟,找轻盈感)。颈肩:低头→抬头→左右侧屈→绕环(各 8 拍);腰部:左右转体→前后顶腰→绕环(各 8 拍);胯部:左右顶胯→前后顶胯→绕环(各 8 拍)。
2025-11-04 16:02:15
134
原创 什么时候需要使用移动构造函数
1. 需要自己管理资源的大型对象2. STL容器中的元素操作容器扩容/添加元素自动调用移动构造3. 函数的返回值是大对象
2025-11-04 10:28:56
150
原创 C++模板和可变参数模板
模板代码在编译期生成,会在调用模板的地方将参数替换到模板里,在调用的文件的作用域内,生成代码,不是函数调用的地方,调用它的文件作用域内,生成代码;通用函数 通用算法 通用类 想使用多种不同类型实现。类模板 部分成员变量/成员函数的参数 是模板类型。所有计算都在编译期完成,运行期0开销;类型安全,编译期就会捕获类型错误;模板实例化——检查调用部分的语法,生成代码。可扩展,可支持多种不同类型复用一份代码;可在编译期完成计算,运行期直接拿到结果;每份代码都要展开,代码膨胀;函数模板是参数是模板类型。
2025-10-30 22:48:26
156
原创 虚函数指针和虚函数表
基类函数为虚函数,编译器编译时,判断指针类型为基类,调用函数为虚函数,动态绑定,会通过虚函数表去寻找析构函数,调用的是子类的析构函数,子类析构时,会在最后自动调用基类的析构函数;子类的访问机制一般来说更严格,如果不限制,会有可能出现绕过安全限制,直接访问子类函数;基类函数非虚函数,静态编译,编译器在编译期间判断指针类型为基类,只调基类析构函数;所有虚函数都在虚函数表中,访问权限不影响虚函数表的构成。**一致性:**相同的代码,不能有时能访问有时不能访问。2、直接对象,基类/子类对象调用,静态绑定;
2025-10-30 11:26:58
383
原创 c++、java/python语言有什么区别?为什么c++更快?
Java语言首先将程序翻译成字节码,之后程序去执行字节码,执行过程中再由翻译器将字节码翻译成机器码去执行,因此执行过程较慢,但好处是换个环境也能执行,不依赖环境。不同操作系统上,系统调用API不同,汇编语言不兼容,汇编语言格式不同操作系统是不同的,目标文件格式不同,因此需要重新编译;换个操作系统/CPU架构/字长/库版本,就需要重新编译;,cpu直接执行机器码,因此高效;python语言是换个环境。
2025-10-29 17:28:25
470
1
原创 C++中extern用法
extern用于声明全局函数/全局变量/c函数/外部全局函数全局函数可以在任何文件内调用,只能有一个定义,可以有多个声明;全局函数的定义,可以加extern也可以不加,extern表示显示声明,这个函数的定义在外部,如果在本文件内定义将报错;调用做法:引用头文件,直接调用;直接在文件内声明 extern int add(…);则无需引用头文件;链接器根据它的符号表寻找;和全局函数类似,区别是extern不能省略。
2025-10-29 16:45:32
164
原创 TCP粘包
TCP 粘包是指发送方连续发送的多个 “消息”,接收方一次性接收为一个连续的字节流,无法直接区分出原本的 “消息边界”。例子:发送方(比如客户端)想给接收方(比如服务器)发 3 条独立消息:“你好”、“今天天气不错”、“吃午饭了吗”。由于 TCP 的传输机制,这 3 条消息可能被 “打包” 成一个字节流(如“你好今天天气不错吃午饭了吗”)发送,接收方收到后,无法直接判断哪里是第一条的结尾、哪里是第二条的开头 —— 这就是粘包。
2025-10-09 21:54:01
627
1
原创 集群服务器架构学习计划
集群(Cluster):了解什么是集群,集群与分布式系统的关系。Kubernetes:深入学习Kubernetes,了解Pod、ReplicaSet、Deployment、Service等资源对象的使用。调优负载均衡算法:学习如何优化负载均衡算法(如轮询、最小连接数、加权轮询等)来提高集群的响应速度和吞吐量。网络协议:学习常用的网络协议(TCP/IP、UDP、HTTP、DNS等),以及它们在集群中的应用。网络配置:了解网络配置,特别是IP地址配置、路由、防火墙等,能够在集群环境中正确配置节点间通信。
2025-09-30 16:02:07
617
原创 云原生技术学习计划
Kubernetes与云服务平台的集成:理解如何在AWS、Azure、Google Cloud等云平台上运行Kubernetes集群。Kubernetes监控与日志:使用Prometheus、Grafana、ELK栈等工具进行集群监控与日志管理。云平台:了解AWS、Azure、Google Cloud、阿里云等云服务平台,学习如何使用这些平台的基本功能。理解云计算的基本概念:IaaS、PaaS、SaaS,私有云、公有云、混合云。Redis、MySQL、PostgreSQL等的Kubernetes部署。
2025-09-30 15:59:08
495
原创 tcmalloc
tcmalloc 是一个动态库 —— 一个由 Google 开发的高性能、低碎片的内存分配器库,用于替代系统默认的 malloc/free 实现。tcmalloc 通过内存粒度分级、线程本地缓存、页级内存池管理等机制,显著降低了内部碎片和外部碎片,同时还提高了分配性能。线程本地缓存:本地复用,这个线程释放的内存放在缓存里优先给当前线程使用,减少锁竞争,本地内存块能快速复用;小对象分级分配:避免内部碎片,固定大小size,只分配固定大小块,可复用。外部碎片:总空闲内存够,但是都是不连续小块,无法复用;
2025-09-18 17:50:32
307
原创 滑动窗口算法
第二天,你不再从头看起,而是向右移动一位,检查第2到第6个学生。此时,你其实已经知道第2到第5个学生的情况了,只需要重点关注新进来的第6个学生和离开的第1个学生即可。如果新水果和圈内的某个重复了,你就必须从左边收缩橡皮筋,把重复的那个水果及它左边的所有水果都移出去,直到圈内没有水果和这个新水果重复为止,然后再把它圈进来。当条件满足后,移动 left 指针来收缩窗口,同时更新结果(比如记录当前窗口的长度是否是最长的)。如果这个新水果和圈内的都不重复,你就成功扩大了橡皮筋(窗口)。此时,窗口大小固定了。
2025-09-18 12:01:23
211
原创 怎么设计一个高效的任务调度器,避免任务饥饿
总结来说,我会结合线程本地队列 + 全局队列 + 工作窃取,加入优先级老化机制、动态调度策略和高效的数据结构,来实现一个高吞吐、低延迟、无饥饿的任务调度器。存在几个问题:1、多队列 + 工作窃取是什么?多队列是一个线程一个任务队列,线程执行的时候优先从本地队列获取任务,如果本地队列空,会从其他线程 的队列里偷任务执行,偷任务就是工作窃取;2、这么多个任务队列,提交任务的时候,往哪个队列内提交?通过哈希、轮询、负载最小选择一个队列放任务;1)轮询分发。
2025-09-12 17:51:17
357
原创 解释一下C++中内存屏障和它的作用——多线程编程
内存屏障是一种编译器或CPU指令,用来防止编译器或CPU对内存操作指令进行重排(reordering)。因此内存屏障分为两种编译器内存屏障:限制编译器对指令的重排;CPU内存屏障:限制处理器对指令的重排(也叫“指令屏障”)。
2025-09-12 16:17:12
294
原创 多态相关知识
在 C++ 中,“多态(Polymorphism)”是一种面向对象编程的核心特性,它允许相同的接口在不同的对象上表现出不同的行为。// 调用 Dog 的 speak,而不是 Animal 的。多态(Polymorphism) 是指在不同类的对象上对同一个函数调用,表现出不同的行为(即不同的实现)。运行时多态 在运行时根据对象的实际类型决定调用哪个函数 虚函数、继承、多态指针/引用。通过继承 + 虚函数实现,在运行时根据实际对象类型调用对应的方法。virtual void speak() { // 虚函数。
2025-09-12 15:20:54
461
原创 如何实现一个自定义的STL容器类,需要注意哪些方面
MyVector(const MyVector& other) 和MyVector(MyVector&& other) noexcept有什么区别,other不都是传进来的引用吗,都是不拷贝一份?const MyVector& other只是不拷贝一份形参,但实现内容会深拷贝一份返回给新对象,且不能修改原值 MyVector&&reference 表示“容器中元素的引用类型”,通常是 T&,用于读写元素。other 是可以修改原值的 因此它可以将原值修改为空,并且接管原值指向的内存。
2025-09-12 14:43:43
153
原创 异常安全性
不泄露资源(比如内存、文件句柄)不破坏对象的状态要么操作成功,要么对象状态不变(强异常安全)“程序在发生异常时,保证对象状态合法、资源不泄漏、逻辑不乱套” —— 这就是异常安全。✅ 二、C++ 中的异常安全级别(标准分法)C++ 有三种常见的异常安全级别:级别 名称 保证内容 示例✅ 1 基本保证不泄漏资源,对象保持合法状态 push_back() 失败,但 vector 不崩溃✅ 2 强保证要么操作成功,要么对象状态完全不变类似事务操作。
2025-09-11 21:32:52
193
原创 new和mallo的区别
7、如果只分配内存,不调用构造函数,这个类对象未完成构造,虚函数指针,成员变量未初始化,对象不完整;调用new的时候会分配内存+调用构造函数,对应的释放内存时使用delete,清理内存+调用析构函数。调用malloc时只分配内存,不调用构造函数,对应的释放内存时使用free,只清理内存不调析构函数。如果构造类,要使用malloc,那还需要手动调用一次构造函数,或者手动调用new来调用构造函数;另外malloc返回的是void* 类型,需要强制类型转换,需要指定大小。new操作符是可以被重载的。
2025-09-11 20:37:41
247
原创 SFINAE
SFINAE 是模板参数替换失败时不报错,而是忽略该模板的一种规则让我们可以写出“如果满足条件就启用这个模板,否则忽略它”的代码主要用在复杂的模板重载和类型特征检测中。
2025-09-11 19:53:13
255
原创 operator关键字
你理解得很准确,关于隐式类型转换,只有单参数(或者带默认参数可以看成单参数)的构造函数才能用来做隐式转换,多参数构造函数是不能用于隐式转换的。这里,C(int, int=5) 看起来是两个参数,但第二个参数有默认值,等同于单参数构造函数,允许隐式转换。A(int x) { /* 构造 */ } // 用来实现 int -> A 的转换。// 隐式转换,用 A(int) 构造函数把 int 转成 A。这里 A(int) 构造函数只有一个参数,刚好可以用来实现 int → A 的转换。
2025-09-11 11:52:42
568
原创 右值引用和移动语义
(如 std::string, std::vector, 自定义管理资源的类)→ 有资源,移动语义才有意义。🧠 堆内存(heap memory) 比如通过 new, malloc, 或 std::string, std::vector 分配的内存。右值传递也一样,接管指针地址,是 新对象和旧对象的“指针变量地址”不同,但它们的“指针变量的值”(即指向的堆地址)是一样的。先在堆上分配内存,复制一份老对象的数据,再让新对象的指针指向这块内存,新老对象指针指向的不是同一块内存;// 移动构造,而不是复制!
2025-09-11 11:13:55
728
原创 C++11的特性以及举例说明应用场景
1、STL库提供很多函数soft、find、2、容器vectorlistde_queuemap4、迭代器iteroter指向容器的指针,用来遍历容器5、范式编程6、lamda表达式(函数对象)7、智能指针unique_ptrshare_ptrweak_ptr自动管理指针对象和内存8、锁lock_guard9、原子编程 autimic。
2025-09-10 23:25:02
476
原创 定位core程序崩溃问题
一般core有可能是数组越界,空指针,非法访问内存 ,子线程未结束主线程提前退出,多个线程访问同一资源未加锁,变量未初始化,使用未赋值的变量等问题,打印日志,分析函数;操作系统检测到程序运行时出现了非法或危险的行为,然后发出一个信号(signal),终止该程序的运行。2)用gdb工具查看core文件,core文件的信号量和调用栈,在哪个函数内崩溃;作用:快速查看当前帧的所有局部变量,是否有异常值(如空指针、意外 0 值等)4)定位到具体函数内,查看崩溃的那一行,发生了什么,查看rax寄存器的值。
2025-09-10 18:00:27
339
原创 虚函数及虚函数表
虚函数表是不是存放在一个固定的地方,不管有多少对象,虚函数表都是在哪,虚函数指针去找它的地址,不同对象有不同的虚函数指针,指针的内容指向都一样?
2025-09-10 17:45:20
113
原创 缓存未命中
❌ 随机访问容器(如 unordered_map) 哈希表节点可能分散,跳来跳去访问内存。❌ 频繁访问大量数据 比如一个 10GB 数组,超出缓存容量(一般几十KB ~ MB)❌ 跨线程竞争同一缓存行(称为 false sharing) 多线程操作挨得太近的数据。❌ 数据访问不连续 比如访问数组跳着取(a[i*10])导致预取失败。❌ 使用指针结构(如链表)遍历 每个节点不连续,CPU 无法预取。✅ 6. 结构体压缩布局(小对象数组压缩)❌ 示例:跳跃访问数组(坏的局部性)✅ 2. 结构体内存对齐优化。
2025-09-10 14:31:05
375
原创 智能指针原理及类型
3、推荐优先使用 unique_ptr,共享才用 shared_ptr,循环引用时配合 weak_ptr。智能指针是一个类模板,含构造函数和析构函数,share_ptr还包含引用计数 是在堆内分配内存。2、C++ 智能指针是用来自动管理内存资源,避免内存泄露,自动申请和释放资源的对象;会引起循环引用 导致引用计数不能降为0 最终无法析构。则weak_ptr不影响析构 不增加引用技术。make_ptr让其只需分配一次内存,在堆内。
2025-09-10 14:21:39
237
原创 怎么避免内存碎片化
内存分配可视化工具:massif, gperftools, Visual Studio 的诊断工具。任务管理器/Valgrind/Heaptrack:查看占用内存 vs 实际使用量。8、使用定制分配器(Allocator)替代默认 new/delete。9、使用专用分配器替换默认分配器(适合大型项目)Linux 上 pmap 查看进程内存分布。自己记录 new/delete 情况。
2025-09-09 16:44:06
222
原创 线程优化——避免死锁
线程B占着资源2,想拿资源1。两个线程不断检测资源是否可用,一直切换状态,但从不真正获取到资源。线程没卡死在等待,而是一直在忙着做“无用功”,比如反复尝试获取资源但总失败,或者陷入死循环。假死(Livelock)/卡死:线程陷入无限循环、资源争用,表现为 CPU 占用低或无响应。程序不动了,所有相关线程都被堵住了,CPU 占用可能不高,因为它们都在等。多个线程相互“等着对方释放资源”,结果谁也不放手,大家都卡在那里了。死锁(Deadlock):多个线程互相等待资源,永远无法继续执行。
2025-09-08 17:47:00
307
原创 高内存占用怎么优化
懒加载(英文:Lazy Loading),是一种按需加载资源的优化技术,常用于提升网页或应用的性能。使用了过大的 STL 容器 合理控制容器大小,及时清理,使用 shrink_to_fit()某个组件不会在应用一开始就加载,而是在真正需要的时候(比如路由切换、用户操作)才去加载它。未释放资源(内存泄漏) 使用智能指针、内存分析工具(如 Valgrind)检测。内存拷贝过多 使用移动语义(std::move),避免不必要的深拷贝。内存碎片化 使用内存池、对象复用技术。检查内存分配量、分配频率、释放时机。
2025-09-08 17:11:44
367
原创 内存池优化
内存池是一种预分配内存块并循环复用的技术,用于减少频繁 new/delete 带来的系统开销和内存碎片。系统调用(如 malloc/free)开销大,频繁分配释放性能低。STL 容器(如 std::list)可自定义分配器实现内存池。✅ 2. 内存池是什么?为什么能优化内存性能?内存池可以从大块内存中切分出小块,统一管理。适合对象生命周期相似、频繁创建/销毁的场景。游戏服务器、数据库连接管理器、网络包缓存。
2025-09-08 16:53:49
159
原创 数据库——连接池管理+减少事务持有时间
🔹 连接管理 使用连接池(如 MySQL 的连接池)减少频繁连接/断开的开销 减少事务持有时间,避免锁表。其实“池化”本质上就是“有限资源复用管理”的通用设计模式,连接池、线程池、对象池都属于这类模式。
2025-09-08 16:30:48
148
原创 数据库优化——缓存优化
假设你有个接口返回“热门用户排行榜”,这数据查询成本比较高且更新不频繁。使用缓存(如 Redis)保存热点数据,减少数据库访问压力。使用结果缓存、Query Cache(适合读多写少的场景)Redis没数据时从MySQL查,再写回Redis。Redis设置过期时间,定期刷新。请求时先从 Redis 取数据。
2025-09-08 16:09:15
168
原创 数据库优化——表结构优化
选择合适的数据类型(如用 INT 而不是 BIGINT)尽量避免 NULL 字段(会降低某些引擎性能)垂直/水平分表,减少单表数据量。垂直水平分表,减少单表数量。
2025-09-08 16:00:50
207
原创 数据库优化——索引优化
每建立一个索引,数据库在执行 INSERT、UPDATE、DELETE 时,都需要维护这些索引(更新索引数据结构)。经常在 WHERE、JOIN、ORDER BY、GROUP BY 中用到的字段,建索引可以加速查询。最左前缀原则:查询中使用联合索引,必须从最左边的字段开始用,才能利用索引。因此,应根据实际查询需求,有针对性地建立必要的索引,避免无用或重复索引。支持的查询类型 等值查询 + 范围查询 + 排序查询 只支持等值查询。联合索引是多个字段组成的索引,比如 (a, b, c)。WHERE b =?
2025-09-08 15:53:55
229
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅