什么是RAII?
RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。
通过构造函数获取资源,通过析构函数释放资源。



std::lock_guard(轻锁)std::unique_lock(重锁)区别_lockguard与uniquelock区别-优快云博客




进程相关
进程简说:进程就是程序的一次执行。



弄懂“进程”(上):3个组成部分、4个基本特征、4个基本状态_进程有哪四个特征-优快云博客
同一进程下的线程共享资源



进程是资源分配的最小单位 线程是资源调度的最小单位
一个进程可以包含多个线程 线程共享进程的资源
创建一个进程的开销更大 系统会为进程分配独立的地址空间 还需要维护数据段 堆栈段等资源
而线程只需要共享进程这些资源
进程之间通信更加复杂 同一进程下的线程共享全局变量 静态变量等数据 通信更加方便
因为进程有独立的地址空间 一个进程崩溃不会对另一个进程产生影响 当进程中的一个线程崩溃时,会导致其所属进程的所有线程崩溃


切换成本低 切换时间更快
线程切换需要成本(需要进去内核空间),如果task是轻量级任务,就不划算


![]()






哈希表
哈希表hash table(key,value) 的做法其实很简单,就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。
而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分利用到数组的定位性能进行数据定位。
时间复杂度为 O(1)。如果只知道数据或者数据中的部分内容,想在数组中找到这个数据,还是需要遍历数组,时间复杂度为 O(N)。

拉链法优点:删除更方便,直接在对应的链表中到找
缺点:需要额外的空间去维护链表
线性探测法的优点在于其实现简单且时间复杂度较低。由于其基于开放寻址法,因此不需要额外的空间来存储元素和键值对。此外,当哈希表大小固定时,线性探测法的查找效率较高。然而,线性探测法也存在一些缺点。当发生大量冲突时,可能会导致哈希表中的元素分布不均匀,从而降低查找效率。此外,如果发生哈希表已满的情况,可能需要重新哈希或扩容操作,这会增加额外的计算和空间开销。

堆和栈






程序使用的栈内存超出最大的值,运行的时候就会发出栈溢出的错误,比如定义了一个很大的数组或者函数的嵌套调用
c++内存泄漏和内存碎片的问题_c++ 资源泄露和内存泄露-优快云博客
内存泄漏

用户态和内核态


用户态只能受限的访问内存, 且不允许访问外设(硬盘、网卡等);在用户态下如果要进行文件操作、网络通信等都操作需要通过系统调用来实现。当应用程序发出系统调用时,会触发上下文切换,将CPU的控制权交给操作系统内核,进入内核态。
内核态下拥有最高的权限。内核态下运行的程序可以访问系统的所有资源,包括CPU、内存、I/O等。


系统调用过程


运行在用户态下的应用程序会发起系统调用请求,通常会涉及到系统调用号和参数,该请求会触发一个中断,导致cpu从用户态切换到内核态并保存现场以便之后可以恢复,系统内核会根据系统调用号和参数查询系统调用表,之后会返回一个结果给应用程序,处理完请求之后会进行恢复现场的操作。
中断和异常


![]()


移动构造函数和拷贝构造函数
使用一个已经创建完毕的对象来初始化一个新对象

md5
MD5是一种哈希函数,它将输入数据(如密码)转换为固定长度(通常是128位)的哈希值。这个过程是不可逆的。
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的(相当于超损压缩)。
2、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

步骤:数据填充、添加消息长度、数据处理、运算


结构体对齐






select比epoll高效


红黑树
深入理解红黑树的演变、变色、旋转!从此告别背诵面试题!_红黑树为什么有两种颜色-优快云博客
红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。



C/C++:编译全过程——预处理、编译、汇编、链接(包含预处理指令:宏定义,文件包括、条件编译)_怎么在devc++里面把c文件变成汇编语言-优快云博客
详解C++代码从源代码到可执行文件的整个编译过程(预处理、编译、汇编和链接)-优快云博客
c++编译过程



编译的输出是一个或多个汇编代码文件,通常以.s为扩展名。






封装

linux常见命令
【Linux】Linux常用命令60条(含完整命令语句)-优快云博客
linux中如何统计一个文件中的字符出现次数-百度经验 (baidu.com)

【ps aux】该命令用于查看当前所有运行的进程。
cd..返回上一级目录







【Linux】sort排序、uniq去重、wc统计_sort 去重-优快云博客




chmod修改权限


被折叠的 条评论
为什么被折叠?



