- 博客(40)
- 收藏
- 关注
原创 C++中IOstream解析
可以通过重载<<和>>操作符,实现用户自定义类型的输入输出。// 重载输出操作符return os;// 重载输入操作符return is;Point p;return 0;
2025-05-23 17:54:54
727
原创 用户缓冲区
合理管理用户缓冲区的内存,避免缓冲区溢出和数据损坏。在进行I/O操作时,数据首先被复制到用户缓冲区,然后由应用程序处理。在I/O操作中,缓冲区用于存储从设备读取的数据或即将写入设备的数据。数据首先从用户缓冲区复制到内核缓冲区,然后从内核缓冲区写入设备。数据首先被复制到内核缓冲区,然后从内核缓冲区复制到用户缓冲区。缓冲区过小会导致频繁的I/O操作,缓冲区过大则可能浪费内存。直接I/O绕过内核缓冲区,直接在用户空间和设备之间传输数据。在进行I/O操作时,务必进行错误检查和处理,确保数据的完整性和系统的稳定性。
2025-05-21 18:48:08
787
原创 进程替换讲解
系列函数用于在当前进程中执行一个新程序。常见的函数包括:这些函数的命名规则如下:函数原型: 参数: 例子:2.2 函数原型:参数:例子:2.3 函数原型:参数:例子:2.4 函数原型:参数:例子:2.5 函数原型:参数:例子:2.6 execvpe() 参数 :要执行的可执行文件的名称。如果 中包含斜杠 (),则将其视为路径名,直接尝试执行。(如果 不包含斜杠,则会在 环境变量指定的目录中查找可执行文件。)
2025-05-15 19:15:19
939
原创 进程等待简单讲解
当一个进程终止时,它会向其父进程发送一个信号(通常是SIGCHLD),并保存退出状态(exit status)。退出状态可以是一个正常终止的返回值,也可以是一个信号导致的终止。
2025-05-13 18:24:28
487
原创 C++线程库
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以并发多个线程,每条线程并行执行不同的任务。
2025-05-09 18:49:45
299
原创 Linux进程解析
1.进程的定义:2.进程与程序的区别:每个进程在内存中有自己独立的地址空间,通常分为以下几个部分:1.代码段(Text Segment):2.数据段(Data Segment):3.堆(Heap):4.栈(Stack):5.内核空间(Kernel Space):6.用户空间(User Space):1.创建:2.运行:3.等待:4.停止:5.终止:Linux采用抢占式多任务调度机制,允许多个进程并发执行。调度算法决定了哪个进程在何时获得CPU资源。1.调度策略:2.调度算法:进程间通信是指不同进程之间交换数
2025-04-26 18:14:10
597
原创 Linus的权限问题
在Linux系统中,是确保系统安全性和资源访问控制的重要机制。Linux采用基于用户(User)、用户组(Group)和其他用户(Others)的权限模型,通过设置不同的权限来控制对文件和目录的访问。
2025-04-22 20:01:10
577
原创 C复习(主要复习)
指针和数组 函数指针:函数指针的定义需要指定函数的返回类型、参数列表以及指针的名称。//return_type (*pointer_name)(argument_type1, argument_type2, ...); Strlen和字符数组: 库函数模拟实现手撕Memcopy: 实现Mommove:实现strstr 自定义类型:内存对齐: 解释:这次是对C中我还不清楚并且比较重要的知识进行总结,顺序可能会有点乱,还请见谅
2025-04-16 20:09:11
498
原创 单例用例(C++)简单分析
是一种创建型设计模式,它确保一个类在程序运行期间只有一个实例存在,并提供一个全局访问点。这个模式在需要全局控制资源(如配置管理、日志系统、线程池等)时非常有用。
2025-04-11 18:28:17
296
原创 智能指针C++11
独占所有权auto_ptr拥有对动态分配对象的唯一所有权。拷贝语义:拷贝一个auto_ptr会转移所有权,而不是进行深拷贝。这意味着拷贝后,原来的auto_ptr将不再拥有对象的所有权。不可拷贝赋值:不能进行拷贝赋值操作,但可以通过拷贝构造函数进行所有权转移。举例// 拷贝构造,转移所有权return 0;//输出ptr1通过分配了一个整数对象。ptr2(ptr1)通过拷贝构造转移了ptr1的所有权,导致ptr1不再拥有对象的所有权,其内部指针被置为nullptr。
2025-04-08 17:47:51
745
原创 C++中lambda的用法
Lambda 函数可以捕获其定义作用域内的变量,这使得它们在处理局部数据时非常有用。例如,在使用标准库算法时,可以方便地访问和操作外部数据。通过将代码逻辑封装在lambda函数中,可以避免代码重复,提高代码的可复用性。同时,lambda函数可以使代码逻辑更加模块化,增强可维护性。Lambda 函数允许在需要时内联定义函数,避免了为简单操作单独声明命名函数的麻烦。这使得代码更加简洁和易读。希望这篇文章有助于你了解lambda的用法,如果有误还请评论区纠正。
2025-04-07 19:09:12
427
原创 左值引用和右值引用
左值是指那些具有持久存储和可标识位置的表达式,通常可以出现在赋值运算符的左侧。左值代表一个具有名称的、可寻址的内存位置。右值是指那些没有持久存储或不可寻址的临时值,通常出现在赋值运算符的右侧。右值代表一个临时的、不可被修改的值。左值引用是对一个持久对象的引用,通常用于函数参数传递和返回值的优化。它使用单个符号表示。右值引用是对临时对象的引用,通常用于实现移动语义和完美转发。它使用双&&符号表示。
2025-04-05 17:17:01
877
原创 布隆过滤器-简单分析
布隆过滤器是一种高效的概率性数据结构,用于快速判断一个元素是否存在于一个集合中。它在空间和时间效率上具有显著优势,但存在一定的误判率。
2025-04-01 18:37:33
905
原创 哈希扩展-位图
用位数组来表示集合的数据结构,对每个位对应一个元素的存在性(1存在,0不存在),下图可以让我们清晰的了解位图的基本概念:在计算机中存储整型数据结果只有两个:存在或者不存在。而二进制中的1/0也可以表示存在与不存在,借此我们可以用一个二进制的比特位来表示存储的数据是否存在,从而节省空间,这样的方法需要我们学习,看下面面试题:这道题倘若用遍历或者二分查找等方法会消耗大量的内存空间,此时我们便可以用位图来解决,从而减少内存空间开销。
2025-03-31 19:01:09
263
原创 哈希表解析
就是将键值映射到哈希表中的索引,一般好的哈希函数应该尽量减少冲突,对于不同的键值映射到相同的索引概率应当要小。常见的函数:-除留余数法:即使用键值对哈希表取模进行映射。-乘法哈希:乘以一个常数值取小数部分生成哈希值。-字符串哈希:对字符串每个字符进行计算,生成对应哈希值。
2025-03-27 19:27:57
355
原创 红黑树解析
int key;bool col;:key(key), col(1)//1为RED,0为BLACK{}1.当叔叔节点存在且为红,则变色,向上更新。2。当叔叔节点不存在或者存在且为黑,旋转+修正颜色。
2025-03-24 20:45:23
608
原创 C++中vector的用法及解析
vector是一种动态数组,其能在运行时依据需要自行调整大小,它不需要在编译时确定大小。并且它的内部使用一个连续的内存块进行存储,代表其可以通过对元素的快速随机访问。
2025-03-18 19:52:07
346
原创 C++ 异常处理
标准异常类可以在C++标准库中查看,这里不再赘述。通常,我们会自己定义异常类。if (b == 0)//除数为0,抛异常elseint main()try {Func();}*///类型不匹配则会终止程序一般情况,自定义异常类会继承它的派生类。//这里继承的是标准库的异常类public:return msg;//输出Caught MyException: My custom exception occurred.
2025-03-17 20:53:00
334
原创 搜索二叉树
3.当删除的节点有俩个子节点,寻找节点替代(两种方法),寻找左子树中最大的节点或右子树中最小的节点,交换当前节点的值,然后删除替代的节点。实现前我们应该分析其一些功能,这里只实现:搜索,插入,删除,遍历(中序)。1.该树的节点的左子树只包含小于该节点的值(左边比节点值小)2.该树的节点的右子树只包含大于该节点的值(右边比节点值大)2.当删除的节点只有一个子节点,用字节的替代被删除的节点。1.当删除的节点为叶子节点,直接删除。4.没有节点值相同的情况(通常)我们简单建立一个模板。
2025-03-12 20:23:22
150
原创 C++中多态的常见问题
当我们将派生类对象赋值给一个基类对象时,派生类中特有的部分会被切掉,保留的只是基类的部分,同时导致多态性失效,这是因为保留的是基类对象,而不是派生类对象。基类的虚构函数若不是虚函数,则我们通过基类指针删除派生类对象时,只会调用基类的析构函数,导致派生类的析构函数未调用,导致内存泄漏。这个例子在基类的构造函数中调用虚函数,但实际调用的是基类的func()(此时派生类的func()未构造)其中若b不是指向test()对象的指针,转换失败,返回nullptr,需进行检查避免未定义。用基类指针或引用避免对象切片。
2025-03-10 20:38:08
201
原创 C中位段的解释
这个例子中,struct NUM 有4个成员,正常来说这四个字节各占32位宽,但是我们指定占位,将其位宽分别指定为5,10,15,20。所以它整个结构体所占的字节空间也发生改变,并不是原来的16个字节,而是8个字节。我们来解析一下为什么。我是用vs2019运行的,我们用它监视,查看s的地址如果是5A 0C 0D,这就是在位宽不足下个数的情况下会浪费空余位宽,这个留给大家自己运行了。这里我们又会产生疑问,剩余2位宽,那么d会不会使用这剩余的2位宽呢?-位数:指定该成员的位数。-成员名:位段的名称。
2024-09-12 17:33:25
199
原创 位操作符详解
常用的位操作符有这几个:"&"(按位与),"|(按位或)","^(按位异或)","~(按位非)","(右移)"。按位异或操作符将两个数的二进制表示进行逐位比较,当两个相应位不同时,结果取1,反之取0,上例子(题外话 我们需了解的是 a^a=0,a^0=a,大家可以自己动手验证一下。按位或操作符将两个数的二进制表示进行逐位比较,只要两比较位中有一个为1,则结果取1,反之取0,上例子。按位与操作符将两个数的二进制表示进行逐位比较,两相同位为1是,结果取1,反之取0,直接上例子。
2024-08-02 18:31:12
718
原创 原码,反码和补码
反码应用于负数,而且我们要了解的是正数的反码和补码是相同的,而负数的反码是全部取反(即1变为0,0变为1),至于符号位变不变这取决与你的编辑器,大部分都是符号位不变的,有一部分会符号位取反。原码为最直观的二进制表示方式,他是将一个数值直接转换为二进制,而且我们要注意的是,在原码表示法中,左边第一位是表示符号的,并且0表示正数,1表示负数,其余就按二进制读取。补码是计算机最常用的表示方法,它的目的是简化运算,正数的补码和原码相同,而负数是原码取反+1(就是负数的反码+1).
2024-08-01 18:09:44
224
原创 C语言中动态内存管理
realloc 用于调整之前通过malloc,calloc或已经用过realloc分配的内存块的大小,若新的大小大于原始大小,realloc可能会分配一个新的内存块,若小于原始内存大小,realloc则会截断原始内存块。p为指向之前通过malloc,calloc或已经用过realloc分配的内存块的指针,若传入NULL,realloc和malloc类似,分配一个新的内存块。并且检查分配是否成功,检查其指针是否为NULL,以确保内存分配成功。函数返回一个指向分配的内存块的指针,若分配失败,返回NULL。
2024-07-31 18:35:21
166
原创 putchar和getcahr用法
1 putchar是一个用于输出单个字符的函数,而printf是格式化输出的函数,其输出的类型多余putchar。其中c为要输出的字符,其可以为int类型,也可以为char类型,为int 类型时我们可以以此判断是否输出成功。返回读取到的字符,但返回的是int类型所以返回的是字符的ASCII码,如果到达文件末尾或发生读取错误,返回。2 putchar只能接受一个字符参数,而printf可以接受多个参数,包括格式字符串和多个输出的值。是一个简单的函数,用于逐个字符地读取输入,而。用于更复杂的输入格式化。
2024-07-30 18:24:18
251
原创 二分法及递归和迭代
要实现二分查找我们得先确定查找的范围,其次在查找范围内,计算索引mid,同时可能会有人询问为什么是mid=left+(right-left)/2,而不是mid=(left+right)/2,这里我们需要了解的是当其定义的数很大的时候它有可能超出了int可定义的范围(我们可以试试INT_MAX这个代码求出int的最大值为2147483647),当left=INT_MAX-1的时候它们相加会溢出,导致乱码,所以我们用的是我们这个例子,防止溢出。基本情况:其终止的条件,阻止其无限递归。举相同的例子,但用迭代。
2024-07-29 18:34:44
482
原创 C语言中函数定义
这个例子它告诉编译器这里存在名为add的函数,其接受两个int类型的参数,而且会返回一个int类型的结果,结果为 a+b;同样我们需要知道的是我们在定义函数时,我们定义的函数类型是什么同样其表达式返回的就是什么类型。这里我们让其返回int类型,但是返回了float类型,这种不匹配会导致编译错误,我们应该注意。如果定义函数类型和函数返回值类型不匹配,可能会导致程序崩溃,数据损坏等结果。当然这个例子比较简单,等我们熟练后可以写更复杂的。这里我们只是举了一个如何定义的例子接下来我们实操。
2024-07-27 18:32:20
230
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人