【C++11】智能指针
📝前言:
这篇文章我们来讲讲C++11——智能指针:
🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础,python入门基础,python刷题专栏,Linux
文章目录
- 一,什么是智能指针
- 传统指针的问题
- RAII和智能指针设计思路
- 二,智能指针的使用
- (1)C++标准库中的智能指针
- 总体概述
- 不同指针的特点
- delete的问题
- 删除器提供示例
- 其他知识
- (2)C++11和boost库中智能指针的关系
- 三,智能指针的原理
- unique_ptr模拟实现
- shared_ptr模拟实现(重点)
- 四,shared_ptr和weak_ptr
- (1)shared_ptr循环引用问题
- (2)weak_ptr解决问题
- weak_ptr使用示例
- 五,share_ptr线程安全问题
- 六,内存泄漏问题
一,什么是智能指针
传统指针的问题
- 内存泄漏(忘记delete)
- 悬垂指针(delete后继续访问)
- 异常安全问题(抛出异常后,后面的delete语句没办法执行)
为了解决上面的问题就出现了:RAII和智能指针设计思路
RAII和智能指针设计思路
RAII:
- 全称:Resource Acquisition Is Initialization(资源获取即初始化)
- 是⼀种管理资源的类的设计思想.
- 本质是⼀种利用对象生命周期来管理获取到的动态资源,避免资源泄漏。这里的资源可以是内存、⽂件指针、网络连接、互斥锁等等。
- 对象控制对资源的访问
- 获取资源与对象的构造绑定
- 释放资源与对象的析构绑定
智能指针:
- 智能指针就是利用了RAII的设计思想。同时,还要求这个对象能够满足普通指针的行为,方便访问资源。
- 即:重载
operator*/operator->/operator[]
等运算符,方便访问资源
二,智能指针的使用
(1)C++标准库中的智能指针
总体概述
- 所在头文件:
<memory>
- 除了
weak_ptr
他们都符合RAII和像指针⼀样访问的行为。(weak_ptr
不能直接管理资源) - 不同的指针,区别主要是:解决智能指针拷贝时的思路不同
不同指针的特点
下面讲讲不同的智能指针的特点:
auto_ptr
- 这是C++98的,是一个糟糕的指针
- 拷贝时:把被拷贝对象的资源管理权移交给拷贝对象
- 问题:这样会导致被拷贝对象悬空,后续访问会报错
- 这指针能不用就不用,C++11也有更好的
unique_ptr
- 特点:不支持拷贝,只支持移动(传
move(ptr)
移动构造,移动后,原ptr
也会悬空,但是这是用户自己的行为) - 如果不需要拷贝的场景就十分建议使用
shared_ptr
- 支持拷贝,也支持移动
- 底层通过引用计数实现
weak_ptr
- 不支持RAII,也就是:不能用它直接管理资源
- 主要用于:解决
shared_ptr
的循环引用导致的内存泄漏问题
delete的问题
- 智能指针析构时默认是进行
delete
释放资源,这也就意味着如果不是new
出来的资源(如:malloc、new[]、fopen...
),交给智能指针管理,析构时就会崩溃
为了解决上面这个问题:
- 智能指针支持用户提供一个删除器,在删除器中实现资源的释放。
- 但是提供位置不同
unique_ptr
:作为模板参数提供(建议提供仿函数)shared_ptr
:作为构造函数参数提供(仿函数、lambda、函数指针等都可以,建议lambda)
- 删除器的本质是一个可调用对象。当提供了删除器,在智能指针析构的时候,就会调用这个删除器去释放资源。(这个删除器的调用在智能指针析构函数内部)
- 因为
new[]
经常使⽤,所以为了简洁⼀点,unique_ptr
和shared_ptr
都特化了⼀份[]
的版本
删除器提供示例
示例:
unique_ptr<Date> up1(new Date[5]);
程序崩溃:
使用特化版本[]
的:
unique_ptr<Date[]> up1(new Date[5]);
shared_ptr
的删除器
示例(使用仿函数):
class Del
{
public:void operator()(Date* ptr){delete[] ptr;}
};
// 传入仿函数删除器
shared_ptr<Date> up1(new Date[5], Del());
return 0;
示例(使用lambda):
shared_ptr<Date> up1(new Date[5], [](Date* ptr) {delete[] ptr; });
unique_ptr
删除器
示例(使用仿函数):
// 模版参数处提仿函数作为删除器
unique_ptr<Date, Del> up1(new Date[5]);
其他知识
shared_ptr
除了支持用指向资源的指针构造,还支持make_shared
用初始化资源对象的值直接构造
示例(普通:使用指向资源的指针构造):
shared_ptr<Date> sp1(new Date); // 使用指向Date的指针构造shared_ptr<Date> sp2(sp1); // 用 sp1 拷贝构造 sp2shared_ptr<Date> sp3 = sp2;// 上面这三管理同一块空间
示例(使用make_shared
)
shared_ptr<Date> sp1(new Date);// 使用语法:make_shared<要创建对象的类型>(初始化对象的参数列表)shared_ptr<Date> sp2 = make_shared<Date>(2025, 5, 2); // 用初始化对象的值直接构造
可见,管理的是新分配的空间。
shared_ptr
和unique_ptr
都支持了operator bool
的类型转换,如果智能指针对象是⼀个空对象没有管理资源,则返回false
,否则返回true
。
示例(直接把智能指针对象给if
判断是否为空):
shared_ptr<Date> sp2 = make_shared<Date>(2025, 5, 2); // 用初始化对象的值直接构造if (sp2) // 实际上是 if(sp2.operator bool()){cout << "p2不为空" << endl;}
shared_ptr
和unique_ptr
的构造函数都用了explicit
修饰,防止普通指针隐式类型转换成智能指针对象
(2)C++11和boost库中智能指针的关系
- Boost 库是 C++ 标准库的扩展程序库集合
- Boost 库由 Boost 社区的成员进行维护。社区成员贡献了许多 C++ 标准库中未包含的功能和工具(有好有坏)
- C++ 委员会在制定新的 C++ 标准时,经常参考 Boost 库,取其精华
- 比如:C ++ 11 引入的
unique_ptr
和shared_ptr
和weak_ptr
。分别是参考boost的scoped_ptr
、shared_ptr
和weak_ptr
三,智能指针的原理
unique_ptr模拟实现
unique_ptr
的思路是不支持拷贝,只支持移动,在移动的时候,把资源管理权交给另一个指针。
实现代码(不带删除器版本的):
template<class T>
class unique_ptr
{
public:explicit unique_ptr(T* ptr):_ptr(ptr){cout << "init: " << _ptr << endl;}~unique_ptr(){if (_ptr){cout << "delete: " << _ptr << endl;delete _ptr;}}T* operator->(){return _ptr;}T& operator*(){return *_ptr;}// 禁用拷贝构造和拷贝赋值unique_ptr(const unique_ptr<T>& up) = delete;unique_ptr<T>& operator=(const unique_ptr<T>& up) = delete;unique_ptr(unique_ptr<T>&& up):_ptr(up._ptr){up._ptr = nullptr; // 原来的置空,相当于转移了管理权}unique_ptr<T>& operator=(unique_ptr<T>&& up){delete _ptr; // 先释放当前所管理的空间_ptr = up._ptr;up._ptr = nullptr;}private:T* _ptr;
};
shared_ptr模拟实现(重点)
底层利用引用计数器来实现多个指针同时管理。
模拟实现代码(带删除器)
template<class T>
class shared_ptr
{
public:explicit shared_ptr(T* ptr = nullptr) // 没有删除器的时候,匹配这个:_ptr(ptr), _count(new int(1)){}template<class D>shared_ptr(T* ptr, D del) // 有删除器的时候会匹配这个:_ptr(ptr),_count(new int(1)),_del(del){}shared_ptr(const shared_ptr<T>& sp):_ptr(sp._ptr),_count(sp._count),_del(sp._del){++(*_count);}// 移动构造函数(区别就是_count不变,并且原来的指针要置空)shared_ptr(shared_ptr<T>&& sp): _ptr(sp._ptr), _count(sp._count), _del(move(sp._del)) // 这里也调用del的移动构造函数,提高效率{sp._ptr = nullptr;sp._count = nullptr;}void release() // 不只用于析构,赋值的时候,release也可能要使用{if (_count && --(*_count) == 0){_del(_ptr); // 调用删除器,删除管理的资源delete _count;_ptr = nullptr;_count = nullptr; // 在把自己的资源释放了}}~shared_ptr(){release();}shared_ptr<T>& operator=(const shared_ptr<T>& sp){if (_ptr != sp._ptr){release();_ptr = sp._ptr;_count = sp._count;_del = sp._del;++(*_count);}return *this;}// 移动赋值shared_ptr<T>& operator=(shared_ptr<T>&& sp){if (this != &sp){release();_ptr = sp._ptr;_count = sp._count;_del = move(sp._del);sp._ptr = nullptr;sp._count = nullptr;}return *this;}T* operator->(){return _ptr;}T& operator*(){return *_ptr;}int use_count() const {return _count ? *_count : 0; // 如果 _count 为空,返回 0}private:T* _ptr;int* _count; function<void(T*)> _del = [](T* ptr) {delete ptr;}; // 删除器,并提供缺省值
};
测试代码:
int main()
{// 构造tr::shared_ptr<Date> sp1(new Date);// 拷贝构造tr::shared_ptr<Date> sp2(sp1);cout << sp2.use_count() << endl;tr::shared_ptr<Date> sp3(new Date);cout << sp3.use_count() << endl;// 拷贝赋值sp3 = sp1;cout << sp1.use_count() << endl;cout << "------------------------------------------------------------" << endl;// 移动构造tr::shared_ptr<Date> sp4(move(sp1));cout << sp4.use_count() << endl;cout << sp1.use_count() << endl; // sp1已经悬空了(不应该继续使用sp1,这里输出0是因为在use_count 里面有判断)// 移动赋值sp4 = move(sp2);cout << sp4.use_count() << endl; // sp2也悬空了,不再管理Date资源cout << "------------------------------------------------------------" << endl;tr::shared_ptr<Date> sp5(new Date[5], [](Date* ptr) {delete[] ptr; });cout << sp5.use_count() << endl;return 0;
}
运行结果:
四,shared_ptr和weak_ptr
(1)shared_ptr循环引用问题
如果节点有前后指针,prev
和next
:
- 当
n1
的next
指向n2
的时候,n2
的引用计数+1 == 2
- 当
n2
的prev
指向n1
的时候,n1
的引用计数+1 == 2
- 当
n1
和n2
析构的时候,引用计数分别-1
变成1
- 但是这时候,
n1
还依被prev
管理,只有prev
释放,n1
的引用计数才能到0
然后被释放 prev
什么时候被释放呢?只有当n2
被释放的时候才被释放,但是n2
被n1
的next
管理n1
的next
什么时候释放?只有n1
被释放才被释放。- 所以造成了循环。
(2)weak_ptr解决问题
weak_ptr
不支持RAII,也不⽀持访问资源,weak_ptr
构造时不支持绑定到资源,只支持绑定到shared_ptr
,绑定到shared_ptr
时,不增加shared_ptr
的引用计数weak_ptr
也没有重载operator*
和operator->
等,因为他不参与资源管理。- 如果
weak_ptr
绑定的shared_ptr
已经释放了资源(或者指向了别的资源),那么他去访问资源就是很危险的(悬空) expired()
可以用来判断weak_ptr
绑定的资源是否失效,失效时返回true
,没失效返回false
lock()
在weak_ptr
绑定的对象还存在的时候,weak_ptr.lock()
可以返回⼀个管理资源的shared_ptr
,这样weak_ptr
就可以访问资源,并且就算原来的shared_ptr
改变了,也有这个新的shared_ptr
(相当于这就是用weak_ptr
创建了一个新的shared_ptr
,引用计数会增加)
weak_ptr使用示例
使用示例:
int main()
{shared_ptr<string> sp1(new string("111111"));shared_ptr<string> sp2(sp1);weak_ptr<string> wp = sp1;cout << wp.expired() << endl;cout << wp.use_count() << endl;// sp1和sp2都指向了其他资源,则weak_ptr就过期了sp1 = make_shared<string>("222222");cout << wp.expired() << endl;cout << wp.use_count() << endl;sp2 = make_shared<string>("333333");cout << wp.expired() << endl;cout << wp.use_count() << endl;cout << "-------------------------------------------------" << endl;wp = sp1; // 重新绑定//shared_ptr<string> sp3 = wp.lock(); cout << wp.use_count() << endl;auto sp3 = wp.lock(); // 利用weak_ptr自己创建一个shared_ptrcout << wp.expired() << endl;cout << wp.use_count() << endl;*sp3 += "###";cout << *sp1 << endl;return 0;
}
运行结果:
五,share_ptr线程安全问题
这里简单讲解一下,暂时不做具体讲解。
shared_ptr
的引用计数对象在堆上,如果多个shared_ptr
对象在多个线程中同时访问修改引用计数,就会存在线程安全问题。- 即:原来是引用计数是
1
,两个线程同时访问增加:理论上结果应该是1 + 1 + 1 == 3
,但是如果两个线程同时拿,拿到的都是1
,则变成两个1 + 1 == 2
出现了错误 - 解决方法:引用计数加锁或原子操作
atomic<int>
- 说明一下:智能指针本身是线性安全的,但是指向的资源不是线性安全的。(智能指针指向的资源的线程安全性取决于资源本身的实现,与智能指针无关)
六,内存泄漏问题
内存泄漏:
- 因为疏忽或错误造成程序未能释放已经不再使⽤的内存。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:
- 普通程序:运行完就结束。不害怕内存泄漏问题,因为进程正常结束,页表的映射关系解除,物理内存也可以释放。
- 长期运行的程序:如操作系统、后台服务、长时间运行的客户端等等,不断出现内存泄漏会导致可用内存不断变少,各种功能响应越来越慢,最终卡死。
如何检测?
- 用检测工具
如何预防?
- 程序员编写代码时,正确使用智能指针,事前预防
- 事后排错,用检测工具
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:
【C++11】智能指针
📝前言: 这篇文章我们来讲讲C11——智能指针: 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀CSDN主页 愚润求学 🌄其他专栏:C语言入门基础,pyt…...
华为云Astro轻应用利用自定义连接器调用第三方接口实际操作
样图 说明 华为云Astro轻应用通过自定义连接器调用第三方接口具有多方面的作用,主要体现在以下几点: 扩展功能与集成能力 调用第三方服务:通过配置自定义连接器,Astro轻应用可以调用第三方提供的Rest协议接口,实现第三方提供的业务功能,扩展应用的能力。 集成外部系统:…...
【中间件】brpc_基础_butex.h
butex.h 学习笔记 源码 1 概述 butex.h 提供了一种用户态同步原语 butex(类似 Linux 的 futex),专为 bthread 设计,用于高效协调线程的阻塞与唤醒。其核心是通过原子操作结合等待队列管理,减少内核态切换开销&#…...
数字智慧方案5876丨智慧交通枢纽智能化系统建设方案(56页PPT)(文末有下载方式)
篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2301_78256053/89575493 资料解读:智慧交通枢纽智能化系统建设方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速,交…...
深度学习笔记40_中文文本分类-Pytorch实现
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.8 2.编译器:Pycharm 3.深度学习环境: torch1.12.1cu113torchvision…...
python设置word字体的方法
在Python中,可以使用python-docx库来设置Word文档的字体样式,以下为具体方法和示例代码: 一、设置段落中字体样式 使用python-docx库时,Word文档中的文本通常被组织成段落(Paragraph对象),而一…...
golang常用库之-标准库text/template
文章目录 golang常用库之-标准库text/template背景什么是text/templatetext/template库的使用 golang常用库之-标准库text/template 背景 在许多编程场景中,我们经常需要把数据按照某种格式进行输出,比如生成HTML页面,或者生成配置文件。这…...
【JAVA】如何快速阅读一个基于maven构建的springboot项目
一、摘要 在JAVA项目开发过程中,现在比较流行的是springboot机构,特别是在后端开发的项目中,springboot应用的非常普遍。springboot很好将大型的、复杂的项目进行分解,以模块或者服务的表现形式组成项目。那么当我们接手一个陌生的…...
Fedora升级Google Chrome出现GPG check FAILED问题解决办法
https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公钥(0x7FAC5991)已安装 https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公钥(0xD38B4796)已安装 仓库 "google-chrome" 的 GPG 公钥已安装,但是不适用于此软件包。 请检查此仓库的…...
深入解析MapReduce:大数据处理的经典范式
引言 在大数据时代,如何高效处理海量数据成为技术核心挑战之一。Hadoop生态中的MapReduce框架应运而生,以其“分而治之”的思想解决了大规模数据的并行计算问题。本文将从原理、核心组件到实战案例,带你全面理解这一经典计算模型。 一、MapR…...
JVM性能调优的基础知识 | JVM内部优化与运行时优化
目录 JVM内部的优化逻辑 JVM的执行引擎 解释执行器 即时编译器 JVM采用哪种方式? 即时编译器类型 JVM的分层编译5大级别: 分层编译级别: 热点代码: 如何找到热点代码? java两大计数器: OSR 编译…...
云计算-容器云-部署jumpserver 版本2
应用部署:堡垒机部署 # 使用提供的软件包配置Yum源,通过地址将jumpserver.tar.gz软件包下载至Jumpserver节点的/root目录下 [rootjumpserver ~]# tar -zxvf jumpserver.tar.gz -C /opt/ [rootjumpserver ~]# cp /opt/local.repo /etc/yum.repos.d/ [roo…...
MSP430G2553驱动0.96英寸OLED(硬件iic)
1.前言 最近需要用MSP430单片机做一个大作业,需要用到OLED模块,在这里记录一下 本篇文章主要讲解MSP430硬件iic的配置和OLED函数的调用,不会详细讲解OLED显示原理(其实就是江科大的OLED模块如何移植到msp430上).OLED显示原理以及底层函数讲解请参考其他…...
同质化的旅游内核
湘西凤凰古城、北京非常有文艺氛围的方家胡同都在被改造翻新为现代的其他城市范式式的样式。 什么意思呢?很多古城的老房子,从外面看,很古老、很漂亮,但是进去以后,完全不是那么回事,整座房子已经被完全掏…...
2025年五一数学建模A题【支路车流量推测】原创论文讲解(含完整python代码)
大家好呀,从发布赛题一直到现在,总算完成了2025年五一数学建模A题【支路车流量推测】完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 A题论文共104页&a…...
文章六:《循环神经网络(RNN)与自然语言处理》
文章6:循环神经网络(RNN)与自然语言处理——让AI学会"说人话" 引言:你的手机为什么能秒懂你? 当你说"我想看科幻片"时,AI助手能立刻推荐《星际穿越》,这背后是RNN在"…...
Redis总结及设置营业状态案例
Redis简介: rRedis服务开启与停止: 服务开启: 在Redis配置文件中输入cmd进入命令行输入redis-server redis-cli.exe -h -p:连接到redis服务 设置密码:在redis.windows.conf中找到requirepass 密码 服务停止: 在服务开启的界面按ctrlc Redis数据类…...
中科大:LLM几何推理数据生成
📖标题:Enhancing the Geometric Problem-Solving Ability of Multimodal LLMs via Symbolic-Neural Integration 🌐来源:arXiv, 2504.12773 🌟摘要 🔸多模态大语言模型(MLLM)的最…...
AimRT从入门到精通 - 04RPC客户端和服务器
一、ROS中的service通信机制 服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即:一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。比如如下场景: 机器…...
【Android】Intent
目录 一、什么是Intent 二、显式Intent 三、隐式Intent 四、复杂数据传递 五、跨应用权限管理 六、常见问题 一、什么是Intent 1. 跨组件通信桥梁 实现组件间通信(Activity/Service/BroadcastReceiver)封装操作指令与数据传输逻辑 目标组件启动…...
从0开始建立Github个人博客(hugoPaperMod)
从0开始建立Github个人博客(hugo&PaperMod) github提供给每个用户一个网址,用户可以建立自己的静态网站。 一、Hugo hugo是一个快速搭建网站的工具,由go语言编写。 1.安装hugo 到hugo的github标签页Tags gohugoio/hugo选择一个版本,…...
Python集合全解析:从基础到高阶应用实战
一、集合核心特性与创建方法 1.1 集合的本质特征 Python集合(Set)是一种无序且元素唯一的容器类型,基于哈希表实现,具有以下核心特性: 唯一性:自动过滤重复元素无序性ÿ…...
Matlab自学笔记
一、我下载的是Matlab R2016a软件,打开界面如下: 二、如何调整字体大小,路径为:“主页”->“预设”->“字体”。 三、命令行窗口是直接进行交互式的,如下输入“3 5”,回车,就得到结果“…...
Python爬虫实战:获取好大夫在线各专业全国医院排行榜数据并分析,为患者就医做参考
一、引言 在当今医疗资源丰富但分布不均的背景下,患者在选择合适的心血管内科医院时面临诸多困难。好大夫在线提供的医院排行榜数据包含了医院排名、线上服务得分、患者评价得分等重要信息,对患者选择医院具有重要的参考价值。本研究通过爬取该排行榜数据,并进行深入分析,…...
多模态人工智能研究:视觉语言模型的过去、现在与未来
多模态人工智能研究:视觉语言模型的过去、现在与未来 1. 引言:定义多模态图景 多模态人工智能指的是旨在处理和整合来自多种数据类型或“模态”信息的人工智能系统,这些模态包括文本、图像、音频和视频等。与通常侧重于单一模态(…...
DeepSeek+Excel:解锁办公效率新高度
目录 一、引言:Excel 遇上 DeepSeek二、认识 DeepSeek:大模型中的得力助手2.1 DeepSeek 的技术架构与原理2.2 DeepSeek 在办公场景中的独特优势 三、DeepSeek 与 Excel 结合的准备工作3.1 获取 DeepSeek API Key3.2 配置 Excel 环境 四、DeepSeekExcel 实…...
3033. 修改矩阵
题目来源: leetcode题目:3033. 修改矩阵 - 力扣(LeetCode) 解题思路: 获取每列的最大值后将-1替换即可。 解题代码: #python3 class Solution:def getMaxRow(matrix:List[List[int]])->List[int]:r…...
Android面试总结之jet pack模块化组件篇
一、ViewModel 深入问题 1. ViewModel 如何实现跨 Fragment 共享数据?其作用域是基于 Activity 还是 Fragment? 问题解析: ViewModel 的作用域由 ViewModelStoreOwner 决定。当 Activity 和其内部 Fragment 共享同一个 ViewModelStoreOwner…...
【无需docker】mac本地部署dify
环境安装准备 #安装 postgresql13 brew install postgresql13 #使用zsh的在全局添加postgresql命令集 echo export PATH"/usr/local/opt/postgresql13/bin:$PATH" >> ~/.zshrc # 使得zsh的配置修改生效 source ~/.zshrc # 启动postgresql brew services star…...
清洗数据集
将label在图片上画出来 按照第一行的属性分类 import os import cv2 import multiprocessing as mp from tqdm import tqdm# ---------- 路径配置 ---------- # IMAGE_DIR = r"C:\Users\31919\Desktop\datasets\13k_100drive_raw_with_hand\images\test" LABEL_DIR =…...
支持向量机(SVM)详解
引言 支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,主要用于分类和回归任务。其核心思想是找到一个最优的决策边界(超平面),最大化不同类别之间的间隔(Margin)…...
MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong
接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么?做什么? pingpong 不务正业了那么久(然而并没有,虽然还在探索sleep,但是教材我已经看完了前三章了),让我们赶紧继续下去 在进行本实验之前请务…...
“淘宝闪购”提前4天全量,意味着什么?
4月30日推出,首日上线50个城市,既定5月6日推广至全国的“淘宝闪购”,突然在5月2日早上官宣,提前4天面向全国消费者全量开放。 这一系列节奏,剑指一个字“快”! 是业务发展远超预期的“快”。 4月30日&am…...
Servlet 解决了什么问题?
Servlet 主要解决了以下几个核心问题: 性能问题 (Performance): CGI 的问题: 传统的 CGI 技术为每个Web 请求都启动一个新的进程。进程的创建和销毁涉及大量的系统资源开销(内存分配、CPU 时间、进程上下文切换等)。在高并发场景下…...
Cherry Studio的MCP协议集成与应用实践:从本地工具到云端服务的智能交互
Cherry Studio的MCP协议集成与应用实践:从本地工具到云端服务的智能交互 一、MCP协议与Cherry Studio的技术融合 MCP(Model Context Protocol) 是由Anthropic提出的标准化协议,旨在为AI模型提供与外部工具交互的通用接口。通过M…...
CPU:AMD的线程撕裂者(Threadripper)系列
AMD的线程撕裂者(Threadripper)系列是AMD面向高性能计算(HPC)、工作站(Workstation)和高端桌面(HEDT)市场推出的顶级处理器产品线。该系列以极高的核心数、强大的多线程性能、丰富的…...
(即插即用模块-Attention部分) 六十二、(2022) LKA 大核注意力
文章目录 1、Larger Kernel Attention2、代码实现 paper:Visual Attention Network Code:https://github.com/Visual-Attention-Network 1、Larger Kernel Attention 自注意力机制在 NLP 领域取得了巨大成功,但其应用于计算机视觉任务时存在…...
Spring 分批处理 + 冷热数据分离:历史订单高效迁移与数据清理实战
在实际业务中,随着时间推移,订单量持续增长,若未及时进行数据治理,会造成数据库膨胀、查询缓慢、性能下降等问题。为了实现数据分层管理和系统高性能运行,我们在项目中采用了“冷热数据分离 分批迁移 数据清理”的综…...
Mybatis中的一级二级缓存扫盲
思维导图: MyBatis 提供了一级缓存和二级缓存机制,用于提高数据库查询的性能,减少对数据库的访问次数。(本质上是减少IO次数)。 一级缓存 1. 概念 一级缓存也称为会话缓存,它是基于 SqlSession 的缓存。在同…...
Elasticsearch 常用的 API 接口
文档类 API Index API :创建并建立索引,向指定索引添加文档。例如:PUT /twitter/tweet/1 ,添加一个文档。 Get API :获取文档,通过索引、类型和 ID 获取文档。如GET /twitter/tweet/1。 DELETE API &…...
纯前端专业PDF在线浏览器查看器工具
纯前端专业PDF在线浏览器查看器工具 工具简介 我们最新开发的PDF在线浏览器工具现已发布!这是一个基于Web的轻量级PDF阅读器,无需安装任何软件,直接在浏览器中即可查看和操作PDF文档。 主要功能 ✅ PDF文件浏览 支持本地PDF文件上传流畅的…...
传奇各职业/战士/法师/道士手套/手镯/护腕/神秘腰带爆率及出处产出地/圣战/法神/天尊/祈祷/虹魔/魔血
护腕排行(战士): 名字攻击攻击(均)魔法魔法(均)道术道术(均)防御防御(均)魔御魔御(均)重量要求图标外观产出圣战手镯2-32.50-000-000-10.50-002攻击: 400.02%双头金刚(50级/5000血/不死系)|赤月魔穴(1725,2125)60分钟2只 0.02%双头血魔(55级/5000血/不死系)|赤月魔穴(1725,212…...
觅知解析计费系统重构版在线支付卡密充值多解析接口免授权无后门源码扶风二开
一、源码描述 这是一套视频解析计费源码(扶风二开),可配置多接口和专用特征解析接口,对接在线支付和卡密支付,支持在线充值和卡密充值,支持点数收费模式和包月套餐收费模式,可配置多个视频解析…...
C++11新特性_委托构造函数
格式定义 在 C11 里,委托构造函数的格式为:一个构造函数能够在其成员初始化列表里调用同一个类的其他构造函数。基本语法如下: class ClassName { public:// 被委托的构造函数(目标构造函数)ClassName(参数列表1) : …...
网工_IP协议
2025.02.17:小猿网&网工老姜学习笔记 第19节 IP协议 9.1 IP数据包的格式(首部数据部分)9.1.1 IP协议的首部格式(固定部分可变部分) 9.2 IP数据包分片(找题练)9.3 TTL生存时间的应用9.4 常见…...
C++负载均衡远程调用学习之QPS性能测试
目录 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 3.QPS_TEST_SERVER端实现 4.QPS_TEST_QPS简单介绍 5.QPS_TEST_QPS客户端工具编写和性能测试 1.昨日回顾 2.QPS_TEST_PROTOBUF协议的集成 ## 14) Reactor框架QPS性能测试 接下来我们写一个测试用例来测一下我们…...
C++负载均衡远程调用学习之消息队列与线程池
目录 1.昨日回顾 2.单线程的多路IO服务器模型和多线程模型区别 3.服务器的集中并发模式 4.LARSV0.8-task_msg消息队列任务数据类型 5.LARSV0.8--thread_queue消息队列的发送和接收流 6.LARSV0.8-thread_pool线程池的实现 7.LARSV0.8-thread_pool线程池的实现 8.LARSV0.8…...
Kotlin 基础
Kotlin基础语法详解 Kotlin是一种现代静态类型编程语言,由JetBrains开发,与Java完全互操作。以下是Kotlin的基础语法详解: 1. 基本语法 1.1 变量声明 // 不可变变量(推荐) val name: String = "Kotlin" val age = 25 // 类型推断// 可变变量 var count: In…...
实验数据的转换
最近做实验需要把x轴y轴z轴的数据处理一下,总结一下解决的方法: 源文件为两个txt文档,分别为x轴和y轴,如下: 最终需要达到的效果是如下: 就是需要把各个矩阵的数据整理好放在同一个txt文档里。 步骤① …...
多种尝试解决Pycharm无法粘贴外部文本【本人问题已解决】
#作者:允砸儿 #日期:乙巳青蛇年 四月初五 笔者在写demo的时候遇到一个非常棘手的问题就是pycharm无法复制粘贴,笔者相信有很多的朋友遇到过这种问题,笔者结合搜素到的和自己揣摩出来的方法帮助朋友们解决这种问题。 1、第一种…...