- 博客(26)
- 收藏
- 关注
原创 C++ CRTP技术(奇异递归模版模式)
最近了解到C++的CRTP技术,通过博客来这里记录一下。我们首先可以了解一下什么是CRTP技术。CRTP是C++的一种高级模版变成模式。
2025-05-07 15:58:43
537
原创 【Linux操作系统】:信号
首先我们可以简单理解一下信号的概念,信号,顾名思义,就是我们操作系统发送给进程的消息。举个简单的例子,我们在写C/C++程序的时候,当执行a / 0类似的操作的时候,程序直接就挂了,这是什么原因呢?其实本质就是CPU在计算的时候出现异常,触发硬件中断,然后我们操作系统发送了对应的信号给进程,然后我们进程默认就退出了。这一系列东西,我都将在后续的文章中具体的提到。
2025-04-08 20:16:36
1176
原创 【Linux内核】从文件层面理解socket建立的方式(优雅的C风格多态)
通过本文的分析,我们从内核层面深入理解了 Socket 的创建和连接机制。从到,再到文件系统与套接字的关联,每一步都体现了 Linux 内核设计的精妙之处。理解这些底层机制,不仅有助于我们更好地掌握网络编程,还能为性能优化提供思路。希望这篇博客能帮助你更好地理解 Socket 的底层实现!
2025-03-19 15:06:06
1088
1
原创 【程序员小技巧】git的常用操作(图解)
user.name 用户名user.email 用户的邮箱–global让我们整台机器的git都使用user.name user.email作为config–l–unset: 重置加上–global就是变成全局的。
2025-03-12 15:08:00
826
1
原创 【计算机网络03】网络层协议IP(详细)
IP协议作为TCP/IP协议族的核心,扮演着互联网通信基石的角色。它如同一位尽职尽责的邮差,在网络世界中穿梭,将数据包准确无误地送达目的地。
2025-03-03 15:14:15
1386
2
原创 【c++语法基础】继承和多态
c++为什么基类指针可以指向派生类的函数,我们知道如果只是普通的函数重写,这种情况下同名的函数构成的覆盖,基类指针通过赋值兼容转换只能调用基类的那个函数不能调用派生类的函数。
2025-02-26 09:13:04
586
原创 【c++语法基础】c/c++内存管理
c和c++在开辟空间的时候还是会有一些区别,毕竟C语言是面相过程,C++是面相对象,而且C++基于C语言引入了类的概念。很多初学者认为malloc和new没有什么区别,但是还是存在着一些明显的差异。
2025-02-26 08:28:19
387
原创 【计算机网络协议02】详解传输层协议TCP/UDP
我们知道TCP中的缓冲区是定长的,因此,16窗口大小表示当前缓冲区的剩余量。传输层协议(TCP/UDP)是网络通信中的核心,负责在源主机和目标主机之间提供可靠或高效的数据传输服务。TCP(传输控制协议)通过三次握手建立连接,确保数据的可靠性和顺序,适用于对数据完整性要求高的场景,如网页浏览和文件传输。UDP(用户数据报协议)则提供无连接服务,传输速度快但不可靠,适合实时性要求高的应用,如视频流和在线游戏。两者各有优劣,选择时需根据具体需求权衡可靠性与效率。
2025-02-24 17:22:08
849
原创 【计算机网络协议01】应用层协议HTTP
应用层协议本来需要程序员自己去指定,但是HTTP等良好的协议值得我们程序员进行学习其中的思想或者直接作为项目协议进行利用。
2025-02-23 19:38:01
889
原创 Linux下多线程(通过系统接口实现封装 + c++11线程库实现封装)
本篇文章主要介绍了如何通过生产者消费者模型实现线程池,以及如何在Linux通过Linux,libpthread.so的动态库实现线程池,同时还加入了日志的编写。
2025-02-06 14:24:15
667
原创 Linux线程,锁
在程序的内部一个执行的路线叫做线程。更准确的定义叫做执行队列。用一个比较通俗易懂的理解,多进程就像是一个项目组有很多的人,每个人执行的分工。多线程就像是一个人同时做很多份工作。
2025-02-05 20:38:05
950
原创 深入理解进程(Linux操作系统下理解进程)
进程 = task_struct + 代码和数据个体 = 户口本 + 加上我们自己Linux中tast_struct中保存的信息的概念进程的状态变量R状态:运行时状态S状态: -- 阻塞等待状态 -- 可中断睡眠,浅睡眠 -- 可中断睡眠D状态 磁盘 -- 阻塞等待状态 -- 不可中断睡眠 -- 深度睡眠如果进程处于D状态,进程不能够被操作系统直接kill掉,这样保证了进程和磁盘io一定不会被操作系统失误的kill掉所以平时当我们查到D状态,要么就是系统快要挂了,要么就是高io的情况。
2024-12-25 22:57:57
623
原创 c++11 之 左右值引用(帮助你完全理解左右值和完美转发)
所以总结一下左右到底有什么用呢,无非就是c++在不断的发展的过程中发现了一些地方进行着没有必要的拷贝构造而进行的优化,如果你比较熟悉模版,这应该对你的提升代码的效率会有比较大的提升。这也可以解释你的一个疑惑(不知你们有没有)???最开始在刷leetcode的时候我很好奇为什么要直接返回一个vector,list之类的容器,而不是将vector<>&作为一个函数的参数,因为返回不会因为拷贝浪费很多的时间吗,学了这里,你应该就懂了,我们的vector拥有自己的移动构造函数,本质上就是将内部的指针进行了交换。
2024-12-05 10:59:05
213
原创 c++之红黑树(一篇文章搞定红黑树中的增删操作)(这是我看多很多文章总结的红黑树最简单的操作)
每个节点要么是红色,要么是黑色。这是红黑树的基本属性之一。根节点是黑色。这意味着在所有情况下,根节点的颜色都是黑色。每个叶子节点(NIL)是黑色。这里的叶子节点指的是空节点或称为NIL节点。从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。这保证了树的平衡性。没有两个相邻的红色节点。即任何红色节点的子节点必须是黑色。这些性质共同确保了红黑树在插入、删除等操作时能够保持相对平衡的状态,从而提供高效的查找性能。红黑树的时间复杂度为O(log n),使其成为一种非常实用的数据结构。
2024-09-11 19:56:55
732
原创 平衡二叉树之AVL树(一篇文章帮助你完全弄懂AVL树)
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家和E.M.Landis在1962年当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整,即可降低树的高度,从而减少平均搜索长度。
2024-09-08 14:50:44
794
原创 c++数据结构之搜索二叉树(不一定最好,一定最懂你)
由于我的博客是一系列的,后续我还会陈述搜索二叉树的问题,并且会提出AVL树,红黑树等更高阶的数据结构,当然,他们都属于搜索二叉树,还有stl标准库中的map和set的运用,由于map和set的底层是红黑树,因此,预知后续如何,请看后续。
2024-07-27 19:48:36
557
原创 c++之string
导语:string 作为c++中我们第一次接触的由c++提供的库的类,可以这么说,当完全理解了string的逻辑后,对于后面其他数据结构的理解也会变得很简单。
2024-05-11 18:06:29
1742
1
原创 C++之c++类中的六大成员函数之构造函数和析构函数
在c++的类中存在着六大默认的成员函数,所谓的六大默认的成员函数,就是理论上如果代码中没有对应函数的显示表示,编译器会自动补充。
2024-04-19 23:28:59
358
原创 构造函数中的无穷递归问题
这里又会调用拷贝构造函数,拷贝构造函数又会创建一个d,并想把d2赋值给d,但是你会发现,操作了半天,实际上一直都没有真正的将d2传递给d,并且成了死循环,这种情况就是拷贝构造中的经典大坑,希望大家看到了这篇博客后以后能注意一下这个点。这是因为,当我们创建Date d1(d2),我们想的是将d2通过拷贝构造传递给d1,但是,如果我们这里写的是Date d,函数会临时创建一个新的Date类型的d,并将d2赋值给d。在上面的代码中为什么拷贝构造函数的必须传递Date&的参数,而不能写成Date呢?
2024-04-15 18:20:34
260
1
原创 分享一下我写二叉树的相关思路
递归其实就是中学阶段大家学过的数列,作为一个接触过数学竞赛的学生,我想说,计算机中的递归就是数列的暴力实现,什么是数列,数列就是一串满足某些相同关系的数的集合,即通过某些项,我可以求后面的项,以此类推,数列的无穷项理论都是可行的。其实,二叉树如果你想通过循环来进行,很多时候都是很复杂并且可能不能实现的,那么,一般情况下,二叉树的相关问题(至少目前我所讲的简单的二叉树),都可以用递归简单的完成。这是一个标准的斐波那契数列,我们首先有基本项,然后通过已知的方式,就可以求的第n项,
2024-03-19 10:33:29
600
1
原创 递归中的隐藏的恐怖复杂度问题
首先我们建立函数栈帧,使得maxDepth(root->left)和maxDepth(root->right)都调用了一次进行了比较,这时,函数栈帧已经销毁,我们得到了他们的大小关系,但是,计算机并没有保留他们最后返回的值,因此,我们还要对其中更深的子树深度进行计算,所以说我又要调用一次第二层中的一个子树(left或者right),这样我们会得到一个结论,假设地n层背=被调用了m次,那么,第n+1层就会有子树背=被调用了2*m次。
2024-03-16 22:48:47
351
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人