- 博客(81)
- 收藏
- 关注
原创 【Linux网络 —— 网络基础概念】
TCP/IP 协议的本质是一种解决方案TCP/IP协议(Transmission Control Protocol/Internet Protocol)是一组用于计算机网络通信的协议,构成了互联网的基础。它定义了数据在网络中如何被分割、传输和重组,并确保不同设备之间能够有效地进行信息交换。TCP/IP应用层传输层网络层和链路层,每一层都负责特定的功能,协同工作以实现端到端的数据传输。通过这一协议,设备能够在全球范围内互联互通,支持各种类型的网络应用。在计算机网络中,
2024-09-24 16:21:52 953
原创 【C++11 —— 智能指针】
内存泄漏是指程序在动态分配内存后,在不需要使用该内存时未能及时释放,结果导致内存空间被一直占用,直到程序运行结束。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,造成了内存的浪费。内存泄漏的危害:性能下降:内存泄漏会导致程序占用的内存越来越多,从而降低程序的运行速度。系统崩溃:严重的内存泄漏会导致程序占用的内存耗尽,从而引发系统崩溃或程序异常退出。资源浪费:内存泄漏会导致系统中的可用内存越来越少,从而浪费系统资源。代码示例。
2024-09-19 21:01:44 644
原创 【C++11 —— 异常】
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。在软件开发中,尤其是复杂系统的开发中,使用自定义异常体系可以帮助团队规范化异常管理。通过定义一套继承体系,所有抛出的异常都是特定基类的派生类,这样外层调用者可以通过捕获基类来处理所有相关的异常。使用自定义异常可以提供更具体的错误信息,使得代码的可读性和可维护性得到提升。
2024-09-17 16:12:30 1347
原创 【C++11 —— 线程库】
在C++11之前,涉及到多线程的问题,都是和平台相关的,比如windows和Linux下各有自己的接口,这使得代码的可移植性比较差。C++11的线程库提供了对多线程编程的支持,使得程序能够并发执行多个任务。从而不再需要依赖于第三方库,而且在原子操作中引入了原子类的概念。在使用标准库里的线程,必须包含头文件。线程 (std::thread)互斥量 (std::mutex)条件变量 (std::condition_variable)原子操作 (std::atomic)
2024-09-16 21:14:23 979
原创 【C++11 —— 包装器】
function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。这些包装器主要用于提供一致且适合的接口以便于处理各种可调用对象,如函数、函数对象、lambda表达式等。其中:是被调用函数的返回类型。是被调用函数的参数类型列表。// func 可以存储接受两个 int 参数并返回 int 的可调用对象bind也是一种函数包装器,也叫做适配器。它可以接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表,C++中的bind本质是一个函数模板。F。
2024-09-13 21:58:07 891
原创 【C++11 ——— lambda表达式】
它使得函数可以作为参数传递,同时也可以作为返回值返回,从而增强了C++的函数式编程能力。Lambda表达式的语法简洁,能够有效减少代码的冗余,提高可读性和可维护性。
2024-09-10 21:11:37 714 1
原创 【C++11 ——— 可变参数模板】
/Args是一个模板参数包//args是一个函数参数包//声明一个参数包Args... args,这个参数包中可以包含0到任意数量个模板参数。中的Args...表示一个模板的参数包,它可以包含0个或多个模板参数。中的args...表示一个函数的参数包,允许函数接受任意数量的参数。...在参数包中的作用...用于声明一个可以包含多个参数的包,一般位于参数名称之前。...用于表示这个函数可以接受多个参数,一般位于参数名称之后。//Args是一个模板参数包//args是一个函数参数包。
2024-09-10 17:38:28 1358
原创 【C++11 ——— 类的新功能】
比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成。这种在类内部就地初始化成员变量的方式,相比于在构造函数的初始化列表中进行初始化,可以使代码更加简洁和易读。当然,如果需要根据传入的参数进行不同的初始化,仍然需要在构造函数中进行处理。可以看到,即使我们没有在构造函数中显式初始化这些成员变量,它们仍然被赋予了在类内部指定的默认值。总之,C++11 引入的这种在类内部指定成员变量默认值的功能,大大简化了类的定义和初始化过程,提高了代码的可读性和可维护性。
2024-09-09 19:14:57 1052
原创 【C++11 —— 常用语法】
在2003年,C++标准委员会提交了一份技术勘误表(简称TC1),使得C++03这个名称取代了C++98,成为C++11之前的最新C++标准名称。不过,由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分没有改动,因此人们习惯性地将这两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准经历了十年的磨砺,第二个真正意义上的标准终于问世。相比于C++98/03C++11带来了数量可观的变化,包含约140个新特性,并修正了C++03标准中约600个缺陷。
2024-09-08 16:21:19 1347
原创 【Linux —— POSIX信号量 - 基于环形队列的生产消费模型】
POSIX信号量提供了一组函数来创建、操作和销毁信号量。环形结构起始状态和结束状态都是一样的,不好判断为空或者为满,所以可以通过加计数器或者标记位来。但是我们现在有信号量这个计数器,就很简单的进行多线程间的同步过程。另外也可以预留一个空的位置,作为满的状态。POSIX信号量是一种用于进程和线程之间。信号量是一种同步原语,通常表现为一个。操作(等待操作),尝试获取信号量。,知道信号量的值增加到允许的范围。如果一个进程尝试将信号量的值。: 初始化未命名信号量。
2024-08-28 21:03:46 1211
原创 【Linux —— 生产者消费者模型】
生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。生产者和消费者,它们通过共享的缓冲区进行通信。生产者负责生成数据并将其放入缓冲区,而消费者则从缓冲区中获取数据并进行处理。生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而共享的缓冲区进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给缓冲区,消费者不找生产者要数据,而是直接从缓冲区取,平衡了生产者和消费者的处理能力。这个缓冲区就是用来给生产者和消费者解耦的。
2024-08-27 22:00:40 1037 1
原创 【Linux —— 线程同步 - 条件变量】
当线程调用该函数时,互斥锁会被自动解锁,允许其他线程访问和修改共享资源。线程在等待条件变量时,必须持有互斥锁,以防止竞争条件,并在被唤醒后重新获取互斥锁,以确保对共享资源的安全访问。在唤醒线程之后,主线程会打印一条消息,表示已经唤醒了一个线程,并睡眠 2 秒钟。来进入等待状态时,互斥量会被自动解锁,允许其他线程修改共享资源和条件状态。被唤醒的线程在继续执行之前,必须重新获取互斥量并检查条件是否满足。:唤醒一个等待该条件变量的线程。,允许线程在某个条件不满足时进入等待状态,直到其他线程通知条件已满足。
2024-08-26 21:38:36 677
原创 【Linux —— 线程互斥】
互斥是一种同步机制,旨在确保同一时刻只有一个执行流(线程或者进程)可以进入临界区。互斥通常通过互斥量(mutex)来实现。互斥量是一种锁,线程或进程在访问临界资源之前需要获取这个锁,完成后释放它。
2024-08-21 23:48:13 992
原创 【Linux —— 理解pthread库和底层逻辑】
这些函数都是对系统调用的封装,提供高效、标准化的多线程编程接口,它通过动态加载和链接机制,不仅节省了系统资源,还提供了灵活的升级路径。在使用pthread库时,程序可以享受标准线程操作接口的便利,而不必关心底层复杂的线程管理和调度细节。实际上,pthread_t 在内部可能是一个线程控制块(TCB)的指针,或者是一个可以唯一标识线程的 ID。标准下的线程管理功能,它提供了**创建、管理、同步和销毁线程的函数。的主要任务就是在一个进程中创建一个新的线程,新的线程共享地址空间和部分资源。,即一个无符号长整型。
2024-08-15 11:26:02 1105
原创 【Linux —— 虚拟地址空间与二级页表的管理与转换】
二级页表(Two-Level Page Table)是一种内存管理结构,主要用于减少虚拟地址空间管理中的内存开销。页目录索引、页表索引和页内偏移量。二级页表通过引入页目录和页表两级结构,减少了直接使用单级页表所需的巨大内存。
2024-08-12 21:36:17 1225
原创 【C++ —— 认识哈希和unordered_set、unordered_map的介绍及模拟】
哈希冲突(Hash Collision)是指两个或多个不同的键通过哈希函数映射到同一个位置。当哈希表发生冲突时,需要使用某种机制来解决冲突,确保所有键值对能够正确存储和查找。哈希函数的定义哈希函数(Hash Function)是将键值转换为哈希值的函数。哈希值用于确定键值在哈希表中的存储位置。一个好的哈希函数能均匀分布键,减少冲突,提高哈希表的性能。
2024-07-28 23:04:42 737
原创 【C++ —— 用一棵红黑树同时封装出map和set】
{}// 各种操作符重载模板参数T:表示树节点存储的数据类型。Ref:引用类型,用于 operator* 的返回类型。Ptr:指针类型,用于 operator-> 的返回类型。成员变量:_node:当前迭代器指向的节点。
2024-07-27 23:27:07 570
原创 【C++ —— 红黑树】
红黑树是一种自平衡二叉搜索树,它在插入和删除操作后,仍能保持树的平衡,从而保证了在最坏情况下,基本动态集合操作的时间复杂度为OlognO(log n)Ologn。这种高效性使得红黑树在许多应用中得到了广泛使用,例如C++的标准模板库(STL)中的map和set。RED,BLACK, _kv(kv){}这里通过枚举常量来控制红黑树每个节点的颜色。
2024-07-21 17:19:10 899
原创 【C++ —— AVL树】
int _bf;//存储当前节点的平衡因子//构造函数,_kv(kv),_bf(0){}这里使用了pair来存储节点的值,_bf表示改节点的平衡因子。
2024-07-19 19:47:29 1019
原创 【STL详解 —— map和set的使用】
set是按照一定次序存储元素的容器。默认情况下,std::set 使用 std::less 作为比较函数,这意味着它会使用小于运算符(
2024-07-17 23:01:11 1089
原创 【Linux 进程间通信 —— systemV 信号量】
在并发编程中,多个进程或线程可能同时访问共享资源,如果不加以限制,就会出现竞态条件(Race Condition)。竞态条件指的是多个进程或线程在相同的资源上进行读写操作时,由于执行顺序的不确定性,导致程序的行为出现异常或结果不一致的情况。
2024-05-16 16:37:03 885
原创 【Linux 进程间通信 —— systemV 共享内存】
因为共享内存其自身的特点,没有额外的拷贝过程,所以共享内存是进程最快的方式,所以共享内存并不保证通信的同步,数据在读取之后也不会清空,所以就能看到一直在之前所读到底字符串后面添加继续打印,。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据.此时再运行程序,即可发现关联该共享内存的进程数由0变成了1,而共享内存的权限显示也不再是0,而是我们设置的666权限。来创建了一个共享内存,打印出其key的十六进制数和shmid。
2024-05-16 16:23:03 1218
原创 【Linux进程通信 —— 管道】
在 Linux 中,进程间通信(IPC,Inter-Process Communication)是指不同进程之间交换数据和信息的一种机制。这种通信可以是在同一台计算机上的不同进程之间,也可以是在不同计算机之间的进程之间。管道(Pipe)是一种用于进程间通信的机制,允许一个进程的输出直接成为另一个进程的输入。它主要用于在父进程和子进程之间或者在同时运行的两个进程之间进行通信。管道可以分为匿名管道(Anonymous Pipe)和命名管道(Named Pipe)两种类型。
2024-05-15 21:32:28 810 1
原创 【C++ —— 多态】
必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上= 0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。class Car //包含纯虚函数所以叫抽象类public:virtual void Drive() = 0 //纯虚函数{}
2024-05-02 22:46:12 932 1
原创 【C++ 继承】
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了。
2024-04-28 17:24:25 1012
原创 【Linux动态库和静态库】
在链接阶段,编译器会将编译后的目标文件和库文件链接成一个可执行文件。这时候库文件才发挥作用,它们被链接到可执行文件中,使得可执行文件包含了库中的函数和数据。对于静态库,链接器会将库中的目标文件直接复制并链接到可执行文件中;对于动态库,链接器只会在可执行文件中包含对动态库的引用,而不包含实际的库函数和数据。
2024-04-28 11:27:37 806
原创 【STL详解 —— stack和queue的介绍及使用】
首先先介绍一下容器适配器。容器适配器是一种设计模式,用于在现有容器的基础上提供新的接口或修改现有接口,以满足特定的需求或者提供特定的功能。在C++中,容器适配器通常是通过组合一个已有的容器来实现的。在C++标准库中,容器适配器是通过模板类来实现的,它们提供了特定的接口,使得用户可以方便地使用已有的容器来实现不同的数据结构或算法。常见的容器适配器包括:stack(栈):提供了后进先出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。
2024-04-14 21:24:03 1088 1
原创 【STL详解 —— list的模拟实现】
如果 ListNode 的 _data 成员是内置类型(如 int, double, char 等),或者是一些简单的、不需要特殊资源管理的自定义类型(例如不涉及动态内存管理的类),那么编译器生成的默认析构函数足以正确清理 ListNode 对象。对于拷贝构造函数,我们先申请一个头结点,并让其前驱指针和后继指针都指向自己,然后将所给容器当中的数据,通过遍历的方式一个个尾插到新构造的容器后面即可。这样的封装提供了清晰的职责分离,并模仿了 STL 的设计哲学,每个类都具有特定的功能和目的。
2024-04-14 16:36:18 984
原创 【STL详解 —— list的介绍及使用】
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2024-04-13 22:43:02 769
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人