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

【C++11】特殊类的设计 单例模式 类型转换

目录

一、特殊类的设计:

1、设计一个不能够拷贝的类:

2、设计一个只能在堆上创建的类

3、设计一个只能在栈上创建的类

4、设计一个不能被继承的类:

二、单例模式:

设计一个只能创建一个对象的类:

饿汉模式:

懒汉模式:

三、类型转换:

1、C语言中的类型转换:

2、C++中的四种类型转换:

static_cast:

reinterpret_cat:

const_cast:

dynamic_cast:

explicit:


一、特殊类的设计:

1、设计一个不能够拷贝的类:

在C++98中,可以将该类的拷贝构造复制重载私有访问权限中声明不定义

//设计一个不能被拷贝的类
class NoCopy
{
public:NoCopy(int n):_n(n){}
private:NoCopy(const NoCopy& copy){}NoCopy& operator=(const NoCopy& copy){}int _n;
};

为什么呢?

这样能够保证其在外面定义的类不能够调用拷贝构造和赋值重载,进而这个类创建的对象就不能被拷贝了

在C++11中新增了delete的用法,在默认成员函数后面跟上 = delete,这样就表示让编译器删除该默认成员函数

class NoCopy
{
public:NoCopy(int n):_n(n){}
private:NoCopy(const NoCopy& copy) = delete;NoCopy& operator=(const NoCopy& copy) = delete;int _n;
};

2、设计一个只能在堆上创建的类

设计这个类有三步:

1、首先将构造函数私有化,这样就保证不能随便创建新对象,就只能通过我们自己写的接口来创建对象

2、向外部提供一个创建对象的接口,并且这个接口要设计成静态的,返回就直接返回new 对象

3、完成上述两个还不全,还要防止在外面进行拷贝构造导致在栈上创建了新对象

class HeapOnly
{
public:static HeapOnly* CreatObj(){return new HeapOnly;}
private://将构造函数私有化HeapOnly(){}//将拷贝构造和赋值重载删掉HeapOnly(const HeapOnly& honly) = delete;HeapOnly& operator=(const HeapOnly& honly) = delete;
};

当我们进行赋值操作后,打印地址看看发现地址是不一样的,为什么呢?----- 难道拷贝构造或者赋值重载没有被删吗

他们其实是被删了,这里发生的是指针拷贝而非对象拷贝,这里是将指针变量hp3和hp1进行拷贝,这是属于内置类型的浅拷贝,与HeapOnly对象无关

当我们进行解引用操作后进行赋值或者拷贝构造此时就发现编译错误了

为什么CreatObj函数要设计成静态的呢?

如果CreateObj函数不设计成静态的,那么它就是一个非静态成员函数,此时调用它就需要一个对象,但是我们又没有对象,要创建第一个对象,在外面是创建不了的,因为把构造函数私有了,这自然就导致了逻辑矛盾,

所以这里要将CreatObj函数设计成静态,这样调用这个静态函数直接通过类域进行调用(HeapOnly::CreatObj()),这样就不需要实例化了,很好解决了需要对象而又没有对象的问题

通过上述了解,这样就能够强制对象只能在堆上创建,如果外面想在栈上创建,但是因为构造函数私有化了,不能够创建,所以只能通过我们写的CreatObj函数在堆上创建对象

3、设计一个只能在栈上创建的类

设计这个类有三步:

1、将构造函数私有化,防止外部直接调用构造函数

2、在向外部提供一个static的接口,直接在栈上创建一个对象返回

3、将new和delete禁用,防止外部通过new在堆上创建对象

class StackOnly
{
public:static StackOnly CreatObj(){return StackOnly();}private:StackOnly(){}//将new和delete禁用void* operator new(size_t size) = delete;void operator delete(void* ptr) = delete;
};

·new和delete的原理:

new在堆上申请空间实际分为两步,首先调用operator new函数在堆上申请空间,然后是在申请的堆空间上执行构造函数,完成对象的初始化工作

delete在释放堆空间也分为两步,第一步是在该空间上执行析构函数,完成对象中资源的清理工作,第二步是调用operator delete函数释放对象的空间

默认是调用在全局中的new和delete,但是如果在类中重载了专属的new和delete那么就会调用专属的重载的函数,所以只要把operator new函数和operator delete函数屏蔽掉,那么就无法再使用new在堆上创建对象了

4、设计一个不能被继承的类:

方法一:

将构造函数私有化即可,这是因为当将父类的构造函数私有化了后,子类调用构造函数的时候,必须调用父类的构造函数,但是父类的构造函数私有化了,这样子类是无法访问父类的构造函数的,所以该类被继承后的子类是无法创建出对象的

class Noinherit
{
public:private:Noinherit(){}
};

方法二:

C++11中引入了关键字final

这个就比较简单了,直接在类后面加上final关键字修饰,被final修饰的类叫做最终类,是不能够被继承的

class Noinherit final
{
public:Noinherit(){}
};

二、单例模式:

在C++中,有大佬根据其经验了许多设计模式,类似于打仗时期的兵法,这些设计模式目的是让代码保证可靠性,更容易被他人理解,使编程更加工程化

设计一个只能创建一个对象的类:

一个类只能创建一个对象,这是单例模式,保证整个程序中,该类只有一个实例化的对象

实现单例模式有两种方法 饿汉模式 与 懒汉模式

饿汉模式:

饿汉模式就是不管在将来的程序中是否使用,在程序启动的时候就创建一个唯一的实例化对象

1、保证在程序启动的时候就创建一个对象

2、将构造函数私有化,保证在外面不能创建对象

3、提供获取单例对象的接口函数

4、防拷贝,将拷贝构造和赋值重载删掉

namespace hungry
{class single{public:static single& Getsingle(){return _single;}void Add(const pair<string, string> kv){_dict[kv.first] = kv.second;}void Print(){for (auto& e : _dict){cout << e.first << ":" << e.second << endl;}}private:single(){}single(const single& sg) = delete;single& operator=(const single& sg) = delete;//类内声明static single _single;map<string, string> _dict;};//类外定义single single::_single;
}

这样,我们的饿汉模式的单例就能够跑起来了

int main()
{hungry::single::Getsingle();hungry::single::Getsingle().Add({ "1","one" });hungry::single::Getsingle().Add({ "2","two" });hungry::single::Getsingle().Add({ "3","three" });hungry::single::Getsingle().Print();return 0;
}

优点:代码简洁直观,适合快速开发,实例在类加载时已创建,调用 Getsingle() 方法时直接返回,无延迟

缺点:要提前实例化,导致进程启动慢,并且若实例未被使用或初始化代价较高,可能造成资源浪费

适用场景:

  • 实例占用资源较少,且程序运行中一定会被使用。
  • 对性能敏感的场景,希望避免首次访问的延迟

懒汉模式:

与饿汉模式不同的是,懒汉模式并不是在程序启动的时候创建,而是当在第一次使用的时候生成唯一的实例

饿汉模式和懒汉模式的理解:

这就好像在吃完饭后,如果是饿汉模式,就将碗洗了,这样在下一次吃饭的时候直接用就可以了,如果是懒汉模式,那么就是在下一次吃饭的时候再洗碗后用

1、将构造函数私有化,保证在外面不能创建对象

2、防拷贝,将拷贝构造和赋值重载删掉

3、用指针初始化的时候就设置为 nullptr了,证明没有实例,但是如果不使用指针,当直接声明的时候,其实就已经调用构造函数了,就不能保证延迟实例化

4、一般单例不用释放,但是如果在特殊场景:中途需要显示释放,程序结束时,需要做一些特殊动作(如打印日志到文件),此时就需要显示写一个释放指针函数,并且这里如果抛异常导致执行流很乱,或者是有多个出口,那么最好不手动调用,而是创建一个对象在程序结束的时候调用析构函数

namespace lazy
{class single{public:static single& Getsingle(){if (_psing == nullptr){_psing = new single;}return *_psing;}static void Delsingle(){//如果_psing不为空,这里是手动释放if (_psing){cout << "static void Delsingle()" << endl;delete _psing;_psing = nullptr;}}void Add(const pair<string, string> kv){_dict[kv.first] = kv.second;}void Print(){for (auto& e : _dict){cout << e.first << ":" << e.second << endl;}}//嵌套一个内部类,当这个成员销毁的时候调用我们显示写的手动释放指针函数class AUTO{public:~AUTO(){cout << "~AUTO()" << endl;lazy::single::Delsingle();}};private:single(){}single(const single& sg) = delete;single& operator=(const single& sg) = delete;map<string, string> _dict;//类内声明//指针保证延迟实例化static single* _psing;static AUTO _AUTO;};//类外定义single::AUTO single::_AUTO;single* single::_psing;
}

这样就成功了,并且能够看到自动调用对应的释放指针函数了

int main()
{lazy::single::Getsingle().Add({ "1","one" });lazy::single::Getsingle().Add({ "2","two" });lazy::single::Getsingle().Add({ "3","three" });lazy::single::Getsingle().Print();return 0;
}

优点:要用的时候才进行初始化,能够节省资源,延迟加载、资源利用高效、适应性强等

缺点:代码复杂度较高,需要处理同步

适用场景:

  1. 资源敏感型应用:如移动端APP、嵌入式系统,需严格控制内存和启动时间
  2. 条件化初始化:实例依赖运行时参数(如用户配置、环境状态)
  3. 模块化系统:避免因加载顺序导致的初始化问题
  4. 高开销对象:如数据库连接池、大型缓存对象
特性懒汉模式饿汉模式
初始化时机首次请求时类加载时
资源占用按需占用,更节省启动即占用,可能浪费
线程安全性需额外处理(如锁、DCLP)天然线程安全(JVM/C++加载机制)
代码复杂度较高(需处理同步)极简
适用场景高开销、非必需使用的单例低开销、必需使用的单例

三、类型转换:

1、C语言中的类型转换:

C语言和C++都是强类型语言,也就是=两边如果不一样就必须进行类型的转换,在C语言中有两种转换的方式,显示类型转换隐式类型转换

  • 隐式类型转换:编译器在编译阶段自动进行转化,能转化就转化,不能就编译报错,隐式类型转换只会发生在相近类型如int和double,或者是单参数的构造函数支持隐式类型的转换
  • 显示类型转换:需要用户自定义进行处理
int main()
{//隐式类型转换int m = 2;double n = m;//这里就发生了隐式类型的转换cout << "m = " << m << endl;cout << "n = " << n << endl;//显示类型转换int* p = &m;int ptr = (int)p;cout << "p = " << p << endl;cout << "ptr = " << ptr << endl;return 0;
}

缺陷:

1、隐式类型转化有些情况下可能会出问题:比如数据精度丢失
2、显式类型转换将所有情况混合在一起,代码不够清晰

因此在C++中就增加了四种强制类型转换

2、C++中的四种类型转换:

static_cast:

用途:用于编译已知的,相近类型的,相对安全的类型转换,但是不能由于两个毫不相干的类型

  • 基本数据类型转换,如int -> double
  • 类层次中的向上转型(派生类指针/引用→基类指针/引用)
  • 显式调用构造函数

特点:

  • 不检查运行时类型,向下转型(基类→派生类)可能不安全
  • 不能移除constvolatile属性
int main()
{double d = 12.34;int a = static_cast<int>(d);cout << a << endl;int* p = &a;// int address = static_cast<int>(p); //errorreturn 0;
}

reinterpret_cat:

用途:用于两个不相关类型之间的转换,低层次的位模式重新解释(如指针→整数、无关类型指针互转),常见于系统编程、硬件操作或序列化

特点:

  • 高度危险,可能导致未定义行为
  • 转换结果依赖具体平台,不可移植
int main()
{int a = 10;int* p = &a;cout << p << endl;int address = reinterpret_cast<int>(p);cout << address << endl;return 0;
}

const_cast:

用途:删除变量的const或者volatile属性,转换后就可以对const变量的值进行修改

特点:

  • 不改变底层数据,但修改原始const对象可能导致未定义行为。
  • 无法用于不同类型之间的转换
int main()
{const int a = 10;//如下是不可修改的//const int* pa = &a;//*pa = 20;int* pa = const_cast<int*>(&a);*pa = 20;cout << "&a = " << &a << endl;cout << "a = " << a << endl;cout <<"a * 10 = " << a * 10 << endl;cout << "pa = " << pa << endl;cout << "*pa = " << *pa << endl;return 0;
}

这里需要注意的是不能够直接修改a,要通过指针来间接修改,代码中用const_cast删除了变量a的地址的const属性,这时就可以通过这个指针来修改变量a的值

	a = const_cast<int>(a);//error

如下是实验结果:

可以发现二者的值居然不一样,但是他们的地址却是一样的,这是为什么呢?

因为编译器默认是认为const的值是不能够被修改的,所以就会将被const修饰的变量放到寄存器中,在进行打印或使用的时候,就直接从寄存器中读取,使用寄存器中的值,当我们进行地址解引用修改的时候,修改的是内存中的值,因此通过地址打印出来的a是修改后的值

如果想让编译器每一次都在内存中读取,而不是在寄存器中读取,可以用volatile修饰对应的const变量,这样就是让编译器每次都在内存中读取,保持了该变量在内存中的可见性

这样就能够从内存中读取了

但是上述我们发现了一个问题,第一行中&a=1,这又是为什么呢?

因为cout这里有一个坑,就是他是采取函数重载的方式匹配的,但是对于地址这种,匹配起来就有点模糊了,可能会匹配到类型是打印值的函数重载上去,简单说,就是将地址以类似于int这种值的方式打印了,所以一般情况下,都很少使用cout来输出地址这种信息的

dynamic_cast:

用途:将父类的指针(或引用)转换成子类的指针(或引用),用于多态类型(含虚函数)的安全向下转型,是一种专门用于多态类型安全转换的操作符,主要解决向下转型(父类指针/引用→子类指针/引用)时的类型安全问题

dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

向上转型: 子类的指针(或引用)→ 父类的指针(或引用)
向下转型: 父类的指针(或引用)→ 子类的指针(或引用)

向下转型的安全性确实取决于 父类指针(或引用)实际指向的对象类型

1、父类指针实际指向的是父类对象,但尝试将其转换为子类指针

风险

  • 子类可能包含父类没有的成员
  • 转换后的指针访问这些成员时,会操作无效内存,导致崩溃

2、父类指针实际指向的是子类对象,此时转换为子类指针是安全的

class A 
{virtual void func(){}
};class B : public A
{ 
public: int data = 1;
};int main()
{A a; A* APtr = &a;					 // 指向父类对象 B* BPtr = dynamic_cast<B*>(APtr); // 危险!这里转换失败,应该是空printf("%p\n", BPtr);B b; A* aPtr = &b;         // 指向子类对象B* bPtr = dynamic_cast<B*>(aPtr); // 安全,转换成功printf("%p\n", bPtr);return 0;
}

explicit:

我们知道,单参数的构造函数支持隐式类型的转换,如果不想要这个发生,我们可以用explicit修饰构造函数进而禁止

class A
{
public:A(int a):_a(a){}int _a;
};int main()
{A a = 1;//这里发生了隐式类型的转换return 0;
}

在早期的编译器中,A a = 1这是先构建一个临时对象,然后在进行拷贝赋值,在如今的编译器中,优化了,如果是单参数的,这样就是直接按照A a(1);这样的方式进行处理,这就是隐式类型的转换

相关文章:

【C++11】特殊类的设计 单例模式 类型转换

目录 一、特殊类的设计&#xff1a; 1、设计一个不能够拷贝的类&#xff1a; 2、设计一个只能在堆上创建的类 3、设计一个只能在栈上创建的类 4、设计一个不能被继承的类&#xff1a; 二、单例模式&#xff1a; 设计一个只能创建一个对象的类&#xff1a; 饿汉模式&…...

基于vue框架的助农特色农产品销售系统i7957(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,商品分类,农产品信息,特价商品,爱心捐赠 开题报告内容 基于Vue框架的助农特色农产品销售系统开题报告 一、研究背景与意义 &#xff08;一&#xff09;研究背景 随着乡村振兴战略的深入实施&#xff0c;特色农产品作为农村经济的重要组成部…...

Linux 学习笔记(3):ls 命令深入剖析与实践应用(期末、期中复习必备)

前言 一、ls 命令基础语法 命令示例 二、工作目录与 HOME 目录 1.工作目录 2.HOME 目录 三、结语 前言 在 Linux 系统的学习旅程中&#xff0c;基础命令的掌握是迈向熟练操作的关键一步。其中&#xff0c;ls 命令作为我们探索系统文件和目录结构的常用工具&#xff0c;有着…...

最简CNN based RNN源码

1.源码&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 最终的效果&#xff1a; 数据集是20个周期&#xff0c;1024点sin(x)加了偏置。其中用于训练的有1024-300点。最后300点用来进行测试。上面的右侧输出的&#xff0c;其实对应左侧x73之后的波形&#xff0…...

大模型是如何把向量解码成文字输出的

hidden state 向量 当我们把一句话输入模型后&#xff0c;例如 “Hello world”&#xff1a; token IDs: [15496, 995]经过 Embedding Transformer 层后&#xff0c;会得到每个 token 的中间表示&#xff0c;形状为&#xff1a; hidden_states: (batch_size, seq_len, hidd…...

Elasticsearch:加快 HNSW 图的合并速度

作者&#xff1a;来自 Elastic Thomas Veasey 及 Mayya Sharipova 过去&#xff0c;我们曾讨论过搜索多个 HNSW 图时所面临的一些挑战&#xff0c;以及我们是如何缓解这些问题的。当时&#xff0c;我们也提到了一些计划中的改进措施。本文正是这项工作的成果汇总。 你可能会问…...

Elasticsearch单节点安装手册

Elasticsearch单节点安装手册 以下是一份 Elasticsearch 单节点搭建手册&#xff0c;适用于 Linux 系统&#xff08;如 CentOS/Ubuntu&#xff09;&#xff0c;供学习和测试环境使用。 Elasticsearch 单节点搭建手册 1. 系统要求 操作系统&#xff1a;Linux&#xff08;Cent…...

前端用户列表与后端分页协同设计

分页实现方案 在现代Web应用中&#xff0c;用户列表展示与分页是一个常见的功能需求。前端与后端通过API协同工作&#xff0c;使用PageHelper等工具实现高效分页。 例如&#xff1a; 后端实现 (使用PageHelper) public PageResult DishPage(DishPageQueryDTO dishPageQuery…...

MyBatis的第四天学习笔记下

10.MyBatis参数处理 10.1 项目信息 模块名&#xff1a;mybatis-007-param数据库表&#xff1a;t_student表结构&#xff1a; id: 主键name: 姓名age: 年龄height: 身高sex: 性别birth: 出生日期 sql文件&#xff1a; create table t_student ( id bigint auto_increm…...

三类人解决困境的方法

有一个视频讲述了三类人解决困境的方法&#xff0c;视频中有持续流出干净水源的水龙头&#xff0c;一杯装满脏水的玻璃杯。第一类普通人是拿着玻璃杯放到水龙头下不断接水&#xff0c;水龙头一直开着的第二类高手是把脏水倒到水池里&#xff0c;然后打开水龙头接水&#xff0c;…...

蓝桥杯第十一届省赛C++B组真题解析

蓝桥杯第十一届省赛CB组真题解析 八、回文日期https://www.lanqiao.cn/problems/348/learning 方法一&#xff1a;暴力枚举所有的日期&#xff0c;记录有多少个回文日期。 #include <bits/stdc.h> using namespace std; int month[13]{0,31,28,31,30,31,30,31,31,30,31…...

Tailscale 的工作原理*

Tailscale 的核心原理基于 WireGuard VPN&#xff0c;它实现了端到端加密的 点对点&#xff08;P2P&#xff09;连接&#xff0c;但在必要时会通过 中继服务器&#xff08;DERP&#xff09; 进行中转。整体来说&#xff0c;它是一个 零配置的 Mesh VPN&#xff0c;让所有设备看…...

PyTorch张量范数计算终极指南:从基础到高阶实战

在深度学习领域&#xff0c;张量范数计算是模型正则化、梯度裁剪、特征归一化的核心技术。本文将以20代码实例&#xff0c;深度剖析torch.norm的9大核心用法&#xff0c;并揭示其在Transformer模型中的关键应用场景。 &#x1f680; 快速入门&#xff08;5分钟掌握核心操作&…...

Innovus DRC Violation和Calibre DRC Violation分析和修复案例

今天把小编昨天帮助社区训练营学员远程协助的一个经典案例分享给大家。希望能够帮助到更多需要帮助的人。如果各位想跟小编来系统学习数字后端设计实现的&#xff0c;可以联系小编。 数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方…...

数据库7(数据定义语句,视图,索引)

1.数据定义语句 SQL数据定义语言&#xff08;DDL&#xff09;用于定义和管理数据库结构&#xff0c;包括创建、修改和删除 数据库对象。常见的DDL语句包括CREATE、DROP和ALTER。 它的操作的是对象&#xff0c;区分操作数据的语句&#xff1a;INSERT,DELETE,UPDATE 示例&#x…...

Cadence 修改 铜和pin脚 连接属性 和 光绘参数修改

光绘层叠设置&#xff0c;参考 光绘参数修改&#xff0c; 中英文对照...

秒杀业务的实现过程

一.后台创建秒杀的活动场次信息&#xff0c;并关联到要秒杀的商品或服务&#xff1b; 二.通过定时任务&#xff0c;将秒杀的活动信息和商品服务信息存储到redis; 三.在商品展示页的显眼位置加载秒杀活动信息&#xff1b; 四.用户参与秒杀&#xff0c;创建订单&#xff0c;将…...

✅ Ultralytics YOLO 训练(Train)时实时获取 COCO 指标(AP):2025最新配置与代码详解 (小白友好 + B站视频)

✅ YOLO获取COCO指标(4): 训练(Train)启用COCO API评估&#xff08;实时监控AP指标&#xff09;| 发论文必看&#xff01; | Ultralytics | 小白友好 文章目录 一、问题定位二、原理分析三、解决方案与实践案例步骤 1: 在 model.train() 调用中设置 save_jsonTrue步骤 2: 修改 …...

java基础 流(Stream)

Stream Stream 的核心概念核心特点 Stream 的操作分类中间操作&#xff08;Intermediate Operations&#xff09;终止操作&#xff08;Terminal Operations&#xff09; Stream 的流分类顺序流&#xff08;Sequential Stream&#xff09;并行流&#xff08;Parallel Stream&…...

基于springboot+vue的课程管理系统

一、系统架构 前端&#xff1a;vue | element-ui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql8 | maven | node v16.20.2 | idea 二、代码及数据 三、功能介绍 01. 登录 02. 管理员-首页 03. 管理员-系管理 04. 管理员-专业管理 05. 管…...

android14 keycode 上报 0 解决办法

驱动改完后发现上报了keycode=0 04-07 13:02:33.201 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false keyguardActive=true policyFlags=2000000 04-07 13:02:33.458 2323 2662 D WindowManager: interceptKeyTq keycode=0 interactive=false key…...

小说现代修仙理论​

修仙理论​ 灵魂感应与感知强化&#xff1a;通过特定的修炼方法&#xff0c;感应自身灵魂&#xff0c;以此提升感知能力&#xff0c;使修炼者对周围环境及自身状态的察觉更为敏锐。​ 生物电的感知与运用​ 生物电感知&#xff1a;修炼者需凝神静气&#xff0c;感知体内生物…...

6.综合练习1-创建文件

题目&#xff1a; 分析&#xff1a; 本例中使用mkdirs方法创建aaa文件夹。 题目要求是"在当前模块下的aaa文件夹"&#xff0c;此时在左侧的目录中&#xff0c;是没有aaa文件夹的&#xff0c;所以要先创建a.txt文件的父级路径aaa文件夹&#xff0c;由于是在当前模块下…...

PostgreSQL的内存管理机制

目录 V1.0PostgreSQL的内存管理机制文件系统缓存作为二级缓存内存切换机制性能影响总结 V2.0PostgreSQL 内存管理机制&#xff1a;双缓存体系验证与笔记完善1. 现有描述验证2. 完善后的内存管理笔记2.1 双缓存体系2.2 其他关键内存区域2.3 验证方法 3. 注意事项 V1.0 PostgreS…...

ReplicaSet、Deployment功能是怎么实现的?

在Kubernetes中&#xff0c;ReplicaSet 和 Deployment 是用于管理 Pod 副本的关键对象。它们各自的功能和实现机制如下&#xff1a; 1. ReplicaSet 功能 管理 Pod 副本&#xff1a;确保指定数量的 Pod 副本一直在运行。如果有 Pod 副本崩溃或被删除&#xff0c;ReplicaSet 会…...

544 eff.c:1761处loop vect 分析

2.6 带有mask的向量数学函数 gcc 支持的svml向量数学函数 32652 GCC currently emits calls to code{vmldExp2}, 32653 code{vmldLn2}, code{vmldLog102}, code{vmldPow2}, 32654 code{vmldTanh2}, code{vmldTan2}, code{vmldAtan2}, code{vmldAtanh2}, 32655 code{vmldCbrt2}…...

搜狗拼音输入法纯净优化版:去广告,更流畅输入体验15.2.0.1758

前言 搜狗输入法电脑版无疑是装机必备的神器。它打字精准&#xff0c;词库丰富全面&#xff0c;功能强大&#xff0c;极大地提升了输入效率。最新版的搜狗拼音输入法更是借助AI技术&#xff0c;让打字变得既准确又高效。而搜狗输入法的去广告精简优化版&#xff0c;通过移除广…...

YOLOv11改进 | YOLOv11引入MobileNetV4

前言&#xff1a; 主要是对该文章YOLOv11改进 | YOLOv11引入MobileNetV4进行复现&#xff0c;以及对一些问题进行解答 1、mobilenetv4核心代码 from typing import Optional import torch import torch.nn as nn import torch.nn.functional as F__all__ [MobileNetV4ConvLa…...

Java中的ArrayList方法

1. 创建 ArrayList 实例 你可以通过多种方式创建 ArrayList 实例&#xff1a; <JAVA> ArrayList<String> list new ArrayList<>(); // 创建一个空的 ArrayList ArrayList<String> list new ArrayList<>(10); // 创建容量为 10 的 ArrayList …...

wordpress 利用 All-in-One WP Migration全站转移

导出导入站点 在插件中查询 All-in-One WP Migration备份并导出全站数据 导入 注意事项&#xff1a; 1.导入部分限制50MB 宝塔解决方案&#xff0c;其他类似&#xff0c;修改php.ini配置文件即可 2. 全站转移需要修改域名 3. 大文件版本&#xff0c;大于1G的可以参考我的…...

零基础教程:Windows电脑安装Linux系统(双系统/虚拟机)全攻略

一、安装方式选择 方案对比表 特性双系统安装虚拟机安装性能原生硬件性能依赖宿主机资源分配磁盘空间需要独立分区&#xff08;建议50GB&#xff09;动态分配&#xff08;默认20GB起&#xff09;内存占用独占全部内存需手动分配&#xff08;建议4GB&#xff09;启动方式开机选…...

聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?

【全球云观察 &#xff5c; 科技热点关注】 随着近年来AI与大模型的兴起&#xff0c;云计算行业正在发生着一场大变局。 “在2025年春节期间&#xff0c;DeepSeek两周火爆全球&#xff0c;如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出&#xff0c;AI与…...

mapreduce 过程中,maptask的partitioner是在map阶段中具体什么阶段分区的?

在MapReduce的Map阶段中&#xff0c;Partitioner&#xff08;分区器&#xff09;的作用发生在map函数输出键值对之后&#xff0c;但在数据被写入磁盘&#xff08;spill到本地文件&#xff09;之前。具体流程如下&#xff1a; 分区发生的具体阶段&#xff1a; Map函数处理完成 当…...

找到字符串中所以字母异位词 --- 滑动窗口

目录 一&#xff1a;题目 二&#xff1a;算法原理 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a;438. 找到字符串中所有字母异位词 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代码实现 版本一&#xff1a;无co…...

密码破解工具

1. 引言 密码是信息安全的核心之一,而攻击者往往利用各种工具和技术来破解密码。密码破解工具可以分为 离线破解(Offline Cracking) 和 在线破解(Online Cracking) 两大类: 离线破解:攻击者已经获取了加密的密码哈希(hash),可以在本地进行破解,无需与目标系统交互。…...

路由策略在双点双向路由重发布的应用

一、背景叙述 路由重发布通常是解决两个不同路由协议之间的互通问题&#xff0c;也就是路由双向引入。有时候&#xff0c;单点路由重发布在大规模网络中压力较大&#xff0c;缺乏冗余性&#xff0c;于是就有了双点双向路由重发布 问题&#xff1a;但是双点双向路由重发布也会…...

在Python软件中集成智能体:以百度文心一言和阿里通义千问为例

摘要 本文旨在探讨如何在Python软件中集成智能体&#xff0c;具体以百度文心一言和阿里通义千问等大模型生成的智能体为例。文章详细介绍了集成这些智能体的方法&#xff0c;包括环境准备、API调用、代码实现等步骤&#xff0c;并提供了相关的示例代码。通过集成这些智能体&…...

day22 学习笔记

文章目录 前言一、遍历1.行遍历2.列遍历3.直接遍历 二、排序三、去重四、分组 前言 通过今天的学习&#xff0c;我掌握了对Pandas的数据类型进行基本操作&#xff0c;包括遍历&#xff0c;去重&#xff0c;排序&#xff0c;分组 一、遍历 1.行遍历 intertuples方法用于遍历D…...

谈Linux之磁盘管理——万字详解

—— 小 峰 编 程 目录 一、硬盘的基本知识 1.了解硬盘的接口类型 2. 硬盘命名方式 3. 磁盘设备的命名 4. HP服务器硬盘 5. 硬盘的分区方式 二、 基本分区管理 1. 磁盘划分思路 2. 分区 2.1 MBR分区 2.2GPT分区 3.格式化—命令&#xff1a;mkfs 4.挂载 4.1手动挂…...

做好一个测试开发工程师第二阶段:java入门:idea新建一个project后默认生成的.idea/src/out文件文件夹代表什么意思?

时间&#xff1a;2025.4.8 一、前言 关于Java与idea工具安装不再展开&#xff0c;网上很多教程&#xff0c;可以自己去看 二、project建立后默认各文件夹代表意思 1、首先new---->project后会得到文件如图 其中&#xff1a; .idea文件代表&#xff1a;存储这个项目的历史…...

伪代码的定义与应用场景

李升伟 整理 伪代码&#xff08;Pseudocode&#xff09;是一种用近似自然语言&#xff08;通常是英语或开发者熟悉的语言&#xff09;和简单语法描述的算法逻辑工具。它介于自然语言和编程语言之间&#xff0c;不依赖具体语法规则&#xff0c;专注于表达思路&#xff0c;是编程…...

/sys/fs/cgroup/memory/memory.stat 关键指标说明

目录 1. **total_rss**2. **total_inactive_file**3. **total_active_file**4. **shmem**5. **其他相关指标**总结 以下是/sys/fs/cgroup/memory/memory.stat文件中一些关键指标的详细介绍&#xff0c;特别是与PostgreSQL相关的指标&#xff1a; 1. total_rss 定义&#xff1…...

机器学习中的聚类分析算法:原理与应用

一、什么是聚类分析&#xff1f; 聚类分析(Clustering Analysis)是机器学习中一种重要的无监督学习技术&#xff0c;它的目标是将数据集中的样本划分为若干个组(称为"簇")&#xff0c;使得同一簇内的样本彼此相似&#xff0c;而不同簇的样本差异较大。与分类不同&am…...

VUE中的路由处理

1.引入,预处理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由规…...

MATLAB学习笔记(二) 控制工程会用到的

MATLAB中 控制工程会用到的 基础传递函数表达传递函数 零极点式 状态空间表达式 相互转化画响应图线根轨迹Nyquist图和bode图现控部分求约旦判能控能观极点配置和状态观测 基础 传递函数表达 % 拉普拉斯变换 syms t s a f exp(a*t) %e的a次方 l laplace(f) …...

Python: 实现数据可视化分析系统

后端基于Python 开源的 Web 框架 Flask&#xff0c;前端页面采用 LayUI 框架以及 Echarts 图表&#xff0c;数据库为sqlite。系统的功能模块分为数据采集和存储模块、数据处理和分析模块、可视化展示模块和系统管理模块。情感分析方面使用LDA等主题建模技术&#xff0c;结合领域…...

VectorBT量化入门系列:第一章 VectorBT基础与环境搭建

VectorBT量化入门系列&#xff1a;第一章 VectorBT基础与环境搭建 本教程专为中高级开发者设计&#xff0c;系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标&#xff0c;深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略部署…...

典型反模式深度解析及重构方案

反模式 1&#xff1a;魔法数字/字符串&#xff08;Magic Numbers/Strings&#xff09; ▐ 问题场景 // 订单状态校验 if (order.getStatus() 3) { // 3代表已发货&#xff1f;sendNotification(); }// 折扣计算 double discount price * 0.15; // 0.15是什么&#xff1f;…...

神经探针与价值蓝海:AI重构需求挖掘的认知拓扑学

当产品经理的决策边界遭遇量子态的用户需求&#xff0c;传统需求分析工具已显露出经典物理般的局限性。Gartner 2024报告揭示&#xff1a;全球Top 500企业中有83%遭遇需求洞察的"测不准困境"——用户声称的需求与行为数据偏差率达47%&#xff0c;而未被表达的潜在需求…...

Tomcat 负载均衡

目录 二、Tomcat Web Server 2.1 Tomcat 部署 2.1.1 Tomcat 介绍 2.1.2 Tomcat 安装 2.2 Tomcat 服务管理 2.2.1 Tomcat 启停 2.2.2 目录说明 2.2.3编辑主页 2.3 Tomcat管理控制台 2.3.1开启远程管理 2.3.2 配置远程管理密码 三、负载均衡 3.1 重新编译Nginx 3.1.1 确…...