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

C++--内存管理

内存管理

1. C/C++内存分布

在C语言阶段,常说局部变量存储在栈区动态内存中的数据存储在堆区静态变量存储在静态区(数据段)常量存储在常量区(代码段),其实这里所说的栈区、堆区、静态区以及常量区都是 虚拟进程地址空间 的一部分,其中具体内存区域的划分如下:

在这里插入图片描述

【说明】:

  • :又叫堆栈,用于存储非静态局部变量、函数参数以及函数返回值等等;栈是向下增长的。
  • :用于程序运行时进行动态内存分配;堆是向上增长的。
  • 数据段 (静态区):Linux 中通常叫作数据段,用于存储存储全局数据和静态数据。
  • 代码段 (常量区):Linux 中通常叫作代码段,用于存储可执行的代码指令和只读常量。
  • 内存映射段:是一种高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,实现进程间通信;
  • 内核空间:操作系统内核 – kernel,受硬件保护,用户不能进行读写,用于执行各种机器指令。

注意:虚拟进程地址空间、多进程多线程以及操作系统内核等相关知识会在 Linux 中进行学习,这里只需要了解 C/C++ 的内存区域划分即可。

例题:

int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);
}1. 选择题:
选项 : A.栈  B.堆  C.数据段(静态区)  D.代码段(常量区)
globalVar在哪里?____  staticGlobalVar在哪里?____
staticVar在哪里?____  localVar在哪里?____
num1 在哪里?____
char2在哪里?____ *char2在哪里?___
pChar3在哪里?____ *pChar3在哪里?____
ptr1在哪里?____ *ptr1在哪里?____2. 填空题:
sizeof(num1) = ____;
sizeof(char2) = ____;    strlen(char2) = ____;
sizeof(pChar3) = ____;   strlen(pChar3) = ____;
sizeof(ptr1) = ____;3. sizeof 和 strlen 区别?答案:(横向)
1、选择题:C C C A A A A A D A B
2、填空题:40 5 4 4/8 4 4/8
3sizeof是操作符/关键字,后面可以不加括号,而直接跟类型,另外,sizeof计算的是变量所占空间的字节数;而strlen是函数,调用必须加括号,且strlen计算的是字符串中字符的个数(不包括'\0')

易错点:

  • sizeof(数组名) 的含义是计算整个数组的大小。
  • *char2*char2 的存储区域:
    • 对于 char2 中的内容是一个常量字符串 abcd 不可以修改存在放在常量区,但是此处的 char2 是一个数组,数组在栈区上开辟空间,本质 char2 中的数据是从常量区中拷贝而来的,所以 char2栈区
    • 对于 *char2 其实本质是对一个数组名进行解引用,这里的数组名的含义是数组首元素的地址,对数组首元素地址进行解引用之后得到的就是数组中的首元素,但是因为数组首元素就是在栈区,所以 *char2 也在栈区
  • pchar3*pchar3 的存储区域:
    • 对于 pchar3 是一个地址指向常量区的 abcd ,但是针对 pchar3 本身来说它就是一个局部变量,所以 pchar3栈区
    • 对于 *pchar3 是对 pchsr3 进行解引用,得到的就是 abcd ,但是 abcd常量区,所以 *pchar3 就在**常量区(代码段)**上

在这里插入图片描述

2. C/C++内存管理方式

2.1 C语言内存管理方式

在C语言中使用 malloc/calloc/realloc/free 函数来进行动态内存管理:

void Test()
{int* p1 = (int*)malloc(sizeof(int));if (p1 == NULL){perror("malloc fail");exit(-1);}int* p2 = (int*)calloc(4, sizeof(int));if (p2 == NULL){perror("calloc fail");exit(-1);}int* p3 = (int*)realloc(p2, sizeof(int) * 10);if (p3 == NULL){perror("realloc fail");exit(-1);}free(p1);free(p2);free(p3);
}

补充:malloc/calloc/realloc的区别?

  • malloc 用于开辟一块动态内存,使用时需要指定开辟的空间大小 (字节),如果开辟成功返回空间的起始地址,如果开辟失败返回 NULL,且不会初始化。
  • calloc 的用法和 malloc 类似,只是它有两个参数,第一个参数为元素个数,第二个参数为每个元素的大小,并且它会将该空间中的数据全部初始化为0。
  • realloc 用于空间的扩容/缩容,它有两个参数,第一个参数为需要调整的动态内存的起始地址,第二个参数为调整后的空间大小,如果第一个参数为 NULL,则它等价于 malloc;如果扩容,编译器会检查原空间后是否有足够的空间,如果足够,就直接扩容并返回原空间的起始地址,如果不够,就新开辟一块空间,然后将原空间的数据拷贝到新空间并返回新空间的地址,最后再释放原空间;如果缩容,编译器会直接新开辟一块空间,然后拷贝原空间数据到新空间并返回新空间的地址,再释放原空间。

2.2 C++动态内存管理方式

C++兼容C语言,所以C语言的内存管理方式在C++中可以继续使用,但由于其而且使用起来比较麻烦且有些地方无能为力,因此C++又提出了自己的内存管理方式:通过 new 和 delete 操作符进行动态内存管理

2.2.1 new/delete 操作内置类型

对于内置类型,C语言和C++内存管理方式没有明显区别,只是C++中使用 new 操作符来替代C语言中的 malloc/calloc 函数,使用 delete 操作符来替代 free 函数 ;

同时,由于 new 和 delete 是操作符/关键字,而不是函数,所以它们后面不需要跟括号,而是直接跟类型即可。另外,new 可以在开辟空间的同时进行初始化

注意:C++不支持扩容,要扩容都是自己开辟新空间、拷贝数据,然后再销毁原空间。

void Test()
{//申请单个空间不初始化int* p1 = new int;//申请单个空间并初始化int* p2 = new int(10);//申请连续空间不初始化int* p3 = new int[10];//申请连续空间并初始化(为初始化的部分会自动由编译器自动初始化)int* p4 = new int[10]{ 1,2,3,4,5 };//释放单个空间delete p1;delete p2;//释放多个空间delete[] p3;delete[] p4;
}

在这里插入图片描述

在这里插入图片描述

注意:申请和释放单个元素的空间,使用 new 和 delete 操作符,申请和释放连续的空间,使用 new[] 和 delete[],注意二者一定要匹配使用,即不能用 delete 来释放 new[] 开辟的空间。

2.2.2 new/delete 操作自定义类型

C++动态内存管理和C语言动态内存管理最大的不同在于二者对自定义类型的处理:C语言 malloc/calloc/realloc 函数只负责开辟空间,free 函数只负责销毁空间。而C++在申请自定义类型的空间时,new 会调用构造函数,delete 会调用析构函数,完成对应对象的初始化和销毁。

class A
{
public://构造函数A(int a = 0): _a(a){cout << "A 构造" << this << endl;}//析构函数~A(){cout << "A 析构" << this << endl;}
private:int _a;
};

在这里插入图片描述

**注意:**先调用析构函数再释放空间。

3. operator new 与 operator delete

在C++中,newdelete 是用户进行动态内存申请和释放的操作符operator newoperator delete系统提供的全局函数new 在底层调用 operator new 全局函数来申请空间,delete 在底层通过 operator delete 全局函数来释放空间。

注意: operator newoperator delete 函数不是运算符重载,因为它们的参数没有自定义类型,而是库里面实现的全局函数,仅仅是将它们取名为 operator 而已

C++底层的 operator new 和 operator delete 函数如下:

// operator new:
// 该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
// 申请空间失败尝试执行空间不足应对措施,如果用户设置了应对措施,则继续申请,否则抛异常。
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{// try to allocate size bytesvoid* p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// report no memory// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}// operator delete:
// 该函数最终是通过free来释放空间的
void operator delete(void* pUserData)
{_CrtMemBlockHeader* pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);  // block other threads__TRY// get a pointer to memory block headerpHead = pHdr(pUserData);// verify block type_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg(pUserData, pHead->nBlockUse);  //此处调用free函数__FINALLY_munlock(_HEAP_LOCK);  // release other threads__END_TRY_FINALLYreturn;
}// free的实现
#define  free(p)        _free_dbg(p, _NORMAL_BLOCK)

new 和 delete

在实际的编译器中,通过查看反汇编来验证 newdelete 的底层调用。下面以开辟内置类型的空间为示例:

int main()
{int* p = new int;delete p;return 0;
}

在这里插入图片描述

new[] 和 delete[]

而对于new[]delete[] 来说,它们通过调用 operator new[]operator delete[] 函数来实现其功能,但是其实 operator new[]operator delete[] 底层也是调用的 operator newoperator delete 函数:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

补充:

通过上述的代码知道 operator new 实际也是通过 malloc 来申请空间,那么为什么还需要对 malloc 进行封装成新的 operator new 函数呢?

因为如果 malloc 申请空间成功就返回新空间的首地址,在申请失败的时候就会返回一个空指针。因为C++是一门面向对象的语言,这样的返回值是无法提现出这样的特性。

所以为了完善这里C++提供了一个对 malloc 新封装的函数 operator new 如果内存正常申请即和 malloc 一样,但是如果申请内存失败就会执行用户提供的空间不足的应对措施,如果用户提供措施就继续申请,否则抛出一个 bad_alloc 类型异常,可以在 main 函数中利用 catch 进行捕获,这样的设计就更加符合C++是一门面向对象语言的特点。

同时因为 operator newoperator delete 还是内置的去全局函数,也可以在程序中调用。

A* p1 = (A*)operator new (sizeof(A));
operator delete (p1);

同样可以起到开辟空间,销毁空间的目的,但是这样使用就不会调用构造函数和析构函数进行初始化和资源的销毁。但是这样使用又比直接使用 malloc 更加方便,因为其不需要再对新申请的空间进行检查,因为其失败了会抛异常。需要在外层捕获异常。

4. new 和 delete 的实现原理

4. 1 内置类型

如果申请的是内置类型的空间,newmallocdeletefree 基本类似,不同的地方是:

  • new/delete 申请和释放的是单个元素的空间,new[]delete[] 申请的是连续的空间
  • new 在申请空间失败时会抛异常,而 malloc 申请失败则是会返回 NULL

4.2 自定义类型

  • new 的原理
    1. 调用 operator new 函数申请空间。
    2. 在申请的空间上调用构造函数,完成对象的初始化
  • delete 的原理
    1. 在空间上执行析构函数,完成对象中资源的清理工作。
    2. 调用 operator delete 函数释放对象的空。
  • new T[N] 的原理
    1. 调用 operator new[] 函数,在 operator new[] 中实际调用 operator new 函数完成N个对象空间的申请。
    2. 在申请的空间上调用N次构造函数。
  • delete[] 的原理
    1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。
    2. 调用 operator delete[] 释放空间,实际在 operator delete[] 中调用operator delete来释放空间。

在这里插入图片描述

在这里插入图片描述

可以看到,对于自定义类型,C++ 中的 new 和 delete 不仅仅会进行空间的申请和释放,还会进行构造和析构,这也正是为什么在C语言已经有了malloc/calloc/realloc/free 的情况下,C++ 又单独创造了 new 和 delete 的原因。

5. 定位 new 表达式(placement - new)

定位 new 表达式是在已分配的原始内存空间中调用构造函数初始化一个对象

其使用格式如下:

new(place_address) type  
new (place_address) type(initializer-list)

其中 place_address 必须是一个指针,initializer-list 是类型的初始化列表。

示例如下:

class A
{
public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){cout << "~A():" << this << endl;}private:int _a;
};int main()
{//p1现在指向的只不过是与A对象相同大小的一段空间,还不能算是一个对象,因为构造函数没有执行A* p1 = (A*)malloc(sizeof(A));if (p1 == NULL){perror("malloc fail");exit(-1);}//定位new--对p1指向的空间显式调用构造函数new(p1)A(1);p1->~A();  //析构函数可以直接显式调用,或者直接使用deletefree(pa);
}

在这里插入图片描述

注意:构造函数在平时的代码中不可以被显示调用,这中使用定位new的方法可以显示调用构造函数。析构函数可以被显示调用,只需要指定好对应对象即可。

这种使用场景其实在平时的开发过程中基本不会使用,因为如上的 main 函数代码就是两行 newdelete 就可以解决的事情。所以**定位 new **的使用场景基本在内存池中。

使用场景:

定位 new 表达式在实际中一般是配合内存池使用

因为内存池分配出的内存对象是没有被初始化的,所以如果是自定义类型的对象,需要使用 new 的定义表达式进行显示调构造函数进行初始化。而内存池在后面会详细学习,此处了解一下即可。

简单理解内存池:

假设半山腰有一个村子,但由于各种原因村子中没有水喝,所以人们每次喝水都只能到山下的公共水井处排队打水,但是呢排队很慢,所以村长就用抽水机+水管联通水井在自己家建了一个蓄水池,以后要用水就直接到蓄水池中去取即可,而不用再到山下去排队打水了,大大提高了效率。

上述例子中全村公用的水井就相当于堆,其他村民排队打水就相当于 malloc/calloc/realloc 函数向堆区申请空间,而村长家的蓄水池就相当于内存池,其实本质也就相当于一次性申请了很大一部分内存供自己的对象本身进行使用,减少了频繁对堆的空间内存申请,内存池的建立可以使得申请空间的效率变得很高。

6. malloc/free 和 new/delete 的区别

6.1 共同点

malloc/freenew/delete 的共同点是:*都是从堆上申请空间,并且需要用户手动释放

6.2 不同点

  • mallocfree 是函数,newdelete 是操作符。
  • 申请内置类型空间时,malloc 申请的空间不可以初始化,new 可以初始化。
  • 申请自定义类型对象时,malloc/free 只会开辟空间,不会调用构造函数与析构函数,而 new 在申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数完成空间中资源的清理。
  • malloc 申请空间时,需要手动计算空间大小并传递,new 只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即。
  • malloc 的返回值为 void* , 在使用时必须强转,new 不需要,因为 new 后跟的是空间的类型。
  • malloc 申请空间失败时,返回的是 NULL ,因此使用时必须判空,new 不需要,但是 new 需要捕获异常。

相关文章:

C++--内存管理

内存管理 1. C/C内存分布 在C语言阶段&#xff0c;常说局部变量存储在栈区&#xff0c;动态内存中的数据存储在堆区&#xff0c;静态变量存储在静态区&#xff08;数据段&#xff09;&#xff0c;常量存储在常量区&#xff08;代码段&#xff09;&#xff0c;其实这里所说的栈…...

YOLOV3 深度解析:目标检测的高效利器

在计算机视觉领域&#xff0c;目标检测一直是一个重要且热门的研究方向&#xff0c;广泛应用于安防监控、自动驾驶、机器人视觉等诸多场景。YOLO&#xff08;You Only Look Once&#xff09;系列算法凭借其出色的实时性和较高的检测精度&#xff0c;在目标检测领域占据着重要地…...

select * from 按时间倒序排序

在SQL中&#xff0c;如果你想要根据时间字段来倒序排序查询结果&#xff0c;你可以使用ORDER BY子句&#xff0c;并结合DESC关键字来实现这个目的。这里有几个常见的场景和示例&#xff0c;假设我们有一个表events&#xff0c;里面包含一个时间戳字段event_time。 示例1&#…...

数据结构-DAY06

一、树的概念 1.链表是数的一部分&#xff08;斜树&#xff09; 2.树的查找速度很快 3.层序&#xff1a;前序&#xff1a;根左右 中序&#xff1a;左根右 后序&#xff1a; 左右根 4.树的存储&#xff1a;顺序结构&#xff0c;链式结构 5.特点&#xff1a; 1&#xf…...

JavaWeb:SpringBoot处理全局异常(RestControllerAdvice)

问题 GlobalExceptionHandler 小结...

免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了

1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具&#xff0c;解决方案覆盖SQL开发、测试、运维的整个流程&#xff0c;提供智能SQL审核、查询重写优化及自动化巡检功能&#xff0c;支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…...

buuctf RSA之旅

BUUCTF-RSA的成长之路 rsarsaRSA1RSA3RSA2RSARSAROLLDangerous RSA[GUET-CTF2019]BabyRSArsa2RSA5[NCTF2019]childRSA[HDCTF2019]bbbbbbrsaRSA4[BJDCTF2020]rsa_output[BJDCTF2020]RSA[WUSTCTF2020]babyrsa[ACTF新生赛2020]crypto-rsa0[ACTF新生赛2020]crypto-rsa3[GWCTF 2019]…...

javascript 编程基础(2)javascript与Node.js

文章目录 一、Node.js 与 JavaScript1、基本概念1.1、JavaScript&#xff1a;动态脚本语言1.2、Node.js&#xff1a;JavaScript 运行时环境 2、核心区别3、执行环境差异3.1、浏览器中的JavaScript3.2、Node.js中的JavaScript 4、共同点5、为什么需要Node.js&#xff1f; 一、No…...

IDEA+AI 深度融合:重构高效开发的未来模式

在 Java 开发领域&#xff0c;IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;作为最受欢迎的集成开发环境之一&#xff0c;一直是开发者的得力工具。而飞算 JavaAI 凭借强大的人工智能技术&#xff0c;为 Java 开发带来了全新的效率提升可能。当 IDEA 与飞算 JavaAI 深度…...

深度学习中常见损失函数激活函数

损失函数 一、分类任务损失函数 二、回归任务损失函数 三、生成对抗网络&#xff08;GAN&#xff09;损失函数 四、其他专用损失函数 五、损失函数选择原则 任务类型&#xff1a;分类用交叉熵&#xff0c;回归用MSE/MAE。 数据分布&#xff1a;类别不平衡时选择Focal Loss或…...

入职软件开发与实施工程师了后........

时隔几个月没有创作的我又回来了&#xff0c;这几个月很忙&#xff0c;我一直在找工作&#xff0c;在自考&#xff08;顺便还处理了一下分手的事&#xff09;&#xff0c;到处奔波&#xff0c;心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生&#xff0c;做我不愿意做的普通…...

告别Spring AI!我的Java轻量AI框架实践(支持多模型接入|注解式MCP架构|附开源地址)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 1. 开发初衷 \quad 大家好&#xff0c;我是犬余&#xff0c;之前&#xff0c;为了体验一下MCP架构的JAVA实现&#xff0c;犬余使用了Spring AI框…...

【软考-架构】15、软件架构的演化和维护

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 软件架构演化和定义面向对象软件架构演化软件架构演化方式的分类软件架构演化原则软件架构演化评估方法大型网站架构演化软件架构维护 软件架构演化和定义 软件架构生命周…...

编译Qt5.15.16并启用pdf模块

编译Qt5.15.16并启用pdf模块 标题1.目录设置 -q-bulid –qt-everywhere-src-5.15.16 –bulid cd bulid 必须&#xff0c;否则会提示Project ERROR: You cannot configure qt separately within a top-level build. create .qmake.stash and .qmake.super in build folder …...

spring中的EnvironmentPostProcessor接口详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 EnvironmentPostProcessor 是 Spring Boot 提供的一个关键扩展接口&#xff0c;允许开发者在 Spring 应用环境初始化后、应用上下文创建前&…...

自学嵌入式 day20-数据结构 链表

注&#xff1a;gdb调试工具用法 3.链表的常规操作 &#xff08;6&#xff09;尾部插入 int InsertTailLinkList(LinkList* ll, DATATYPE* data) { if (IsEmptyLinkList(ll))//判断链表是否为空 { return InsertHeadLinkList(ll, data); } else { …...

Java设计模式之外观模式:从入门到精通(保姆级教程)

外观模式是结构型设计模式中非常实用的一种,它为复杂的子系统提供了一个统一的简化接口。本文将全面深入地剖析外观模式,从基础概念到高级应用,通过丰富的代码示例、图表和日常生活类比,帮助您彻底掌握这一模式。 一、外观模式基础概念 1.1 什么是外观模式? 外观模式(…...

Ubuntu 20.04 postgresql

安装命令 $ sudo apt-get update $ sudo apt-get install -y postgresql查看postgresql版本 $ psql --version psql (PostgreSQL) 12.22 (Ubuntu 12.22-0ubuntu0.20.04.3)查看系统用户组是否存在postgres $ getent group postgres postgres:x:115: $ getent passwd postgres…...

游戏引擎学习第295天:堆叠房间用于Z层调试

关于确定哪些系统影响许多其他系统&#xff0c;并尽早将其固定下来 目前我们的游戏开发已经进入了一个关键阶段&#xff0c;我们觉得是时候来彻底解决 Z&#xff08;深度&#xff09;相关的问题了。之前我们在 Z 轴的处理上做了一些尝试&#xff0c;但始终没有一个明确的定论&…...

【Python 算法零基础 4.排序 ② 冒泡排序】

目录 一、引言 二、算法思想 三、时间复杂度和空间复杂度 1.时间复杂度 2.空间复杂度 四、冒泡排序的优缺点 1.算法的优点 2.算法的缺点 五、实战练习 88. 合并两个有序数组 算法与思路 ① 合并数组 ② 冒泡排序 2148. 元素计数 算法与思路 ① 排序 ② 初始化计数器 ③ 遍历数组…...

【工具】Windows|外接的显示器怎么用软件调亮度(Brightness Slider)

文章目录 工具安装及使用Twinkle Tray&#xff1a;Brightness Slider补充背景知识1. DDC/CI&#xff08;Display Data Channel Command Interface&#xff09;2. WMI&#xff08;Windows Management Instrumentation&#xff09;3. Twinkle Tray如何结合两者&#xff1f;对比总…...

1.3.3 数据共享、汇聚和使用中的安全目标

探索数据共享、汇聚与使用中的安全目标 在当今数字化时代&#xff0c;数据的价值愈发凸显&#xff0c;数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而&#xff0c;在这一过程中&#xff0c;数据安全至关重要&#xff0c;我们需要明确并保障保密性、完整性…...

【QT】类A和类B共用类C

当类A和类B需要操作同一个输入框时&#xff0c;需要采用共享实例的设计模式。以下是具体实现方案&#xff1a; 1. 核心实现思路 #mermaid-svg-cdmYFhkgOZ5C0uI5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cdmYF…...

《算法导论(第4版)》阅读笔记:p86-p90

《算法导论(第4版)》学习第 19 天&#xff0c;p83-p85 总结&#xff0c;总计 3 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1. inkling (1)inkling: inclen(“utter in an undertone&#xff0c;低声说话”) c. a hint(提示)&#xff1b;a slight knowledg…...

AI在网络安全中的应用之钓鱼邮件检测

0x01 前言 为什么写这个呢&#xff0c;源自于我之前在某教培网站留了信息&#xff0c;不出意外的个人信息泄露的飞快&#xff0c;邮箱开始疯狂收到垃圾邮件甚至钓鱼邮件&#xff0c;看着每天的拦截消息&#xff0c;就在想这个拦截机制挺好玩的&#xff0c;拦截器是怎么知道是不…...

游戏引擎学习第294天:增加手套

准备战斗 我们正在进行的是第294天的开发&#xff0c;目前暂时没有特别确定要做的内容&#xff0c;但我们决定继续研究移动模式相关的部分。虽然一些小型实体系统已经在运行&#xff0c;但并不确定最终效果如何。 今天我们决定实现一个全新的功能&#xff1a;战斗系统。这是游…...

[架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)

[架构之美]从PDMan一键生成数据库设计文档&#xff1a;Word导出全流程详解&#xff08;二十&#xff09; 一、痛点 你是否经历过这些场景&#xff1f; 数据库字段频繁变更&#xff0c;维护文档耗时费力用Excel维护表结构&#xff0c;版本混乱难以追溯手动编写Word文档&#…...

5个开源MCP服务器:扩展AI助手能力,高效处理日常工作

AI大语言模型&#xff08;如Claude、GPT&#xff09;尽管强大&#xff0c;但其原生形态仅限于文本对话&#xff0c;无法直接与外部世界交互。这一局限严重制约了AI在实际应用场景中的价值发挥 - 无法主动获取实时数据、无法操作外部系统、无法访问用户私有资源。 MCP&#xff…...

服务器的基础知识

什么是服务器 配置牛、运行稳、价格感人的高级计算机&#xff0c;家用电脑不能比拟的。 服务器的组成&#xff1a;电源、raid卡、网卡、内存、cpu、主板、风扇、硬盘。 服务器的分类 按计算能力分类 超级计算机 小型机AIX x86服务器&#xff08;服务器cpu架构&#xff09; …...

bisheng系列(二)- 本地部署(前后端)

一、导读 环境&#xff1a;Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景&#xff1a;需要bisheng二开商用&#xff0c;故而此处进行本地部署&#xff0c;便于后期调试开发 时间&#xff1a;20250519 说明&#xff1a;bisheng前后…...

华为ODgolang后端一面面经

MySQL死锁是怎么产生的&#xff1f; 假如有一条SQL语句执行了非常久&#xff0c;你会怎么优化呢&#xff1f; explain 索引什么情况下会失效&#xff1f; InnoDB和MyISAM引擎的区别是什么&#xff1f; 为什么是三次握手 避免历史连接 同步双方初始序列号避免资源浪费 为什么…...

UE5 GAS框架解析内部数据处理机制——服务器与客户端

当&#xff0c; gas通过点击鼠标光标触发事件时&#xff0c;内部的处理机制。 当通过点击事件&#xff0c;命中中目标时&#xff0c; 可获取到对应的TargetData 目标数据。处理相应的操作。 仅有本地的客户端的情况下。命中并不会有什么异常。 当存在服务器时&#xff0c; 服…...

《打造第二大脑》

序 第二大脑&#xff0c;前景无限 2025/05/08 发表想法 是的说的太对了&#xff0c;关键是之前自己一直在找如何能避免出现此问题的方法&#xff0c;今天终于看到了本书所讲的的内容 原文&#xff1a;我们耗费了无数的时间阅读、倾听和观摩他人提供的处世原则、思考方式以及生活…...

Word2Vec详解

目录 Word2Vec 一、Word2Vec 模型架构 &#xff08;一&#xff09;Word2Vec 的核心理念 &#xff08;二&#xff09;Word2Vec 的两种架构 &#xff08;三&#xff09;负采样与层次 Softmax &#xff08;四&#xff09;Word2Vec 的优势与局限 二、Word2Vec 预训练及数据集…...

[特殊字符] Word2Vec:将词映射到高维空间,它到底能解决什么问题?

一、在 Word2Vec 之前,我们怎么处理语言? 在 Word2Vec 出现之前,自然语言处理更多是“工程方法”,例如字符串匹配、关键词提取、正则规则...。但这些表示通常缺乏语义,词与词之间看不出任何联系以及非常浅显。当然,技术没有好坏,只有适合的场景。例如: 关键词匹配非常…...

anythingLLM支持本地大模型嵌入知识库后进行api调用

anythingLLM 可以使用本地大模型&#xff0c;并且可以嵌入知识库&#xff08;Knowledge Base&#xff09;&#xff0c;通过 API 调用该知识库。 ✅ 一、anythingLLM 的基本架构 anythingLLM 是一个支持多种本地大模型&#xff08;如 LLaMA、Qwen、ChatGLM 等&#xff09;的开…...

PHP 实现连续子数组的最大和、整数中1出现的次数

在编程面试和实际应用中&#xff0c;处理数组和整数的常见问题之一是求解连续子数组的最大和以及计算整数中1出现的次数。本文将详细介绍如何使用 PHP 实现这两个问题的解决方案。 连续子数组的最大和 连续子数组的最大和问题要求找到一个数组中的连续子数组&#xff0c;使得…...

面试题之进程 PID 分配与回收算法:从理论到 Linux 内核实现

总结&#xff1a; 在操作系统中&#xff0c;进程 PID&#xff08;Process Identifier&#xff09;的分配与回收是核心功能之一。本文深入剖析了三种主流算法&#xff1a;位图法、空闲链表法和位图 哈希表组合法&#xff0c;并结合 Linux 内核源码探讨其优化思路。通过时间复杂…...

Pyro:基于PyTorch的概率编程框架

Pyro&#xff1a;基于PyTorch的概率编程框架 **Pyro&#xff1a;基于PyTorch的概率编程框架**基础讲解**一、Pyro核心模块****1. 入门与基础原语****2. 推理算法****3. 概率分布与变换****4. 神经网络与优化****5. 效应处理与工具库** **二、扩展应用与社区贡献****1. 特定领域…...

API Gateway REST API 集成 S3 服务自定义 404 页面

需求分析 使用 API Gateway REST API 可以直接使用 S3 作为后端集成对外提供可以访问的 API. 而当访问的 URL 中存在无效的桶, 或者不存在的对象时, API Gateway 默认回向客户端返回 200 状态码. 而实际上这并不是正确的响应, 本文将介绍如何自定义返回 404 错误页面. 基本功…...

02-前端Web开发(JS+Vue+Ajax)

介绍 在前面的课程中&#xff0c;我们已经学习了HTML、CSS的基础内容&#xff0c;我们知道HTML负责网页的结构&#xff0c;而CSS负责的是网页的表现。 而要想让网页具备一定的交互效果&#xff0c;具有一定的动作行为&#xff0c;还得通过JavaScript来实现。那今天,我们就来讲…...

visual studio code中的插件都是怎么开发的?用的什么编程语言?

目录 开发VS Code插件的编程语言 开发VS Code插件的步骤 学习资源 Visual Studio Code(VS Code)是一款流行的开源代码编辑器,由微软开发,支持多种编程语言。它的一个重要特性是可以通过插件(Extensions)来扩展其功能。这些插件可以增加新的语言支持、主题、调试器以及…...

python第30天

知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 浙大疏锦行-CSDN博客 from lib.ut…...

【数据仓库面试题合集③】实时数仓建模思路与实践详解

实时数据仓库已经成为各大企业构建核心指标监控与业务实时洞察的基础能力。面试中,关于实时建模的题目频繁出现,尤其聚焦于建模思路、宽表设计、状态管理、乱序处理等方面。本文整理典型题目及答题思路,帮助你应对相关考察。 一、建模原则与数仓分层认知 1. 实时数仓与离线…...

kotlin Android AccessibilityService 无障碍入门

安卓的无障碍模式可以很好的进行自动化操作以帮助视障人士自动化完成一些任务。 无障碍可以做到&#xff0c;监听屏幕变化&#xff0c;朗读文本&#xff0c;定位以及操作控件等。 以下从配置到代码依次进行无障碍设置与教程。 一、配置 AndroidManifest.xml 无障碍是个服务…...

精益数据分析(69/126):最小可行化产品(MVP)的设计、验证与数据驱动迭代

精益数据分析&#xff08;69/126&#xff09;&#xff1a;最小可行化产品&#xff08;MVP&#xff09;的设计、验证与数据驱动迭代 在创业旅程中&#xff0c;从需求洞察到产品落地的关键一跃是打造最小可行化产品&#xff08;MVP&#xff09;。今天&#xff0c;我们结合《精益…...

JVM频繁FullGC:面试通关“三部曲”心法

想象一下&#xff0c;你的Java应用程序是一个繁忙的工厂&#xff0c;JVM堆内存就是工厂的仓库和车间。垃圾收集&#xff08;GC&#xff09;就像工厂的清洁工&#xff0c;负责清理不再需要的废料&#xff08;无用对象&#xff09;&#xff0c;腾出空间让新的生产&#xff08;对象…...

Scala语言基础与函数式编程详解

Scala语言基础与函数式编程详解 本文系统梳理Scala语言基础、函数式编程核心、集合与迭代器、模式匹配、隐式机制、泛型与Spark实战&#xff0c;并对每个重要专业术语进行简明解释&#xff0c;配合实用记忆口诀与典型代码片段&#xff0c;助你高效学习和应用Scala。 目录 Scal…...

大语言模型 13 - 从0开始训练GPT 0.25B参数量 MiniMind2 补充 训练开销 训练步骤 知识蒸馏 LoRA等

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

【NLP】37. NLP中的众包

众包的智慧&#xff1a;当“无数人”帮你训练AI 当我们谈论构建大语言模型时&#xff0c;脑海中浮现的往往是服务器、GPU 和Transformer&#xff0c;而很少想到成千上万的普通人也在默默贡献力量。 这背后依赖的机制就是&#xff1a;众包&#xff08;Crowdsourcing&#xff0…...