自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 链接、装载与库

本文追溯至早期计算机为背景引入重定位与链接的概念,围绕程序如何运行进行讨论,探寻各结构的设计理念,尽可能详尽地阐述程序在编译后各个阶段;最后为了串联全文,制作了一个简单的动态库,编写了一个简单的程序调用该共享库。

2025-08-11 17:22:07 1128

原创 软链接与硬链接

两种链接都用于在文件系统中创建对文件或目录的引用。虽然它们都可以用来访问文件或目录,但它们的实现方式和特性有区别。

2025-05-17 21:17:06 241

原创 Linux文件系统

文件由内容与属性构成,Linux下这二者是分开存储的,这种设计的核心是通过和来实现的。struct file中有结构体指针f_inode,其指向Inode结构体,这个结构体存储了文件的元数据(即文件属性),每个文件(包括普通文件、目录、设备文件等)都有一个唯一的inode,但文件名并不在其中。:数组的前几个指针直接指向数据块。:当文件较大时,直接块指针不足以存储所有数据块,此时会使用间接块指针。:指向一个块,该块中存储了更多的数据块指针。:指向一个块,该块中存储了更多的一级间接块指针。

2025-05-14 13:49:18 1143

原创 重定向操作

>在 Linux 系统中,重定向是一种非常强大的功能,它允许用户将命令的输入、输出或错误信息重定向到其他位置,例如文件、设备或管道。通过重定向,可以实现对数据流的灵活控制。

2025-05-13 20:49:50 498

原创 Linux文件结构

是一个内核数据结构,用于管理一个进程打开的所有文件。每个进程都有一个实例,它包含了文件描述符表和其他与文件相关的状态信息,中存储了指向的指针。包含了文件描述符表的指针,该表是一个结构体指针数组,每个指针指向一个以表示已打开文件实例,其中包含文件的当前偏移量、访问模式、指向文件操作函数的指针等信息。文件描述符的本质是该数组的下标,多个文件描述符可以指向同一个,例如通过fork()创建的文件描述符会共享同一个。文件描述符分配规则:分配最小且未被使用的文件描述符。这段代码,可以有效的证明上述说明。

2025-05-13 17:52:38 417

原创 性能的平衡——红黑树

为了追求效率,红黑树不似AVL树那般完全平衡,前辈们选择牺牲部分搜索效率以换取整体性能的提升。但总的来讲,红黑是比AVL树更简单,但也比其更抽象,其最关键的点在与如何对节点的颜色修改或对节点进行旋转,以保证各路径黑节点总数的一致,而这个关键点的难点又在于理解u节点为黑时的情况——这又得对其下抽象子树进行理解。

2024-12-10 00:40:59 395

原创 平衡二叉搜索树——AVL树

本文以非平衡二叉树作为切入,主要聚焦AVL树的节点旋转进行讨论分析,以具象的代数思维理解抽象的更新思想,在梳理逻辑的同时呈现具体实现

2024-12-02 05:17:46 870

原创 进程地址空间与写时拷贝

本文以一段简短的C代码为引入,简要介绍进程地址空间,突出了其为进程与进程间数据代码解耦的便利性,又以其引出写时拷贝这项在操作系统中不可或缺的技术

2024-10-10 23:15:28 507

原创 环境变量与进程控制

各种shell指令本质上也是可执行程序,但不需要加上./即可执行(./是为了指明路径,在当前目录下寻找可执行程序)下有两种不加./即可执行程序的方法——1.将这个程序移至/usr/bin/下(可能会污染指令库,不建议)2.修改默认路径,也就是环境变量PATH,指令为——export PATH=该程序所在绝对路径(会覆盖原有路径,致使shell瘫痪)export PATH=$PATH:该程序所在绝对路径。

2024-10-10 21:47:46 574

原创 进程与多进程实现

程序是什么,进程是什么,二者的区别又是什么——程序是存放在磁盘的可执行文件——也就是一系列的指令集合,而进程可以说是被加载到内存的程序,是程序的一次执行过程——同一程序可能会有多个进程执行。也就是说程序是静态的,进程是动态的。进程的组成——进程是由内核数据结构和进程对应的磁盘代码组成的。在Windows下,这个内核数据结构是PCB(Process Control Block);在Linux下,这个内核数据结构是task_struct,本文围绕Linux讨论。

2024-10-09 20:19:16 1011

原创 集合论与位运算的结合

—如:现有集合(集合中元素皆为非负整形)A = {1,2,3},那么这个集合就可以用二进制1110₂来表示——集合中的元素n如果存在,其对应二进制的(n - 1)位就为1,不存在就为0。如果要对两个哈希表取交集,这就需要遍历两个哈希表,效率不高。增加元素对应着将该元素所对应的二进制位改为1:如在上述的集合A中加上5这个元素,就是A∪{5},也就是将其二进制数0011110变为0111110,这里设 a = 0011110,将1左移五位再与a按位或即可实现,(1 << 5) | a = 0111110。

2024-09-28 15:59:12 554

原创 系统编程基础与Linux下的集成开发环境

Linux下一切皆文件,Linux中的权限自然也就是与文件相关的权限。用户:owner, grouper , other文件属性:r(read) , w(write) ,x(execute)文件类型:- 普通文件——如源代码,库文件,可执行程序,文件压缩包等d 目录文件;l 链接文件;p 管道文件;c 字符设备文件;b 块文件;s socket文件有了以上认识,再看下文件的各个属性:第一个字符为-, 说明是一个普通文件;

2024-09-18 20:50:36 784 1

原创 C++类和对象——进阶

本文围绕类和对象进行讨论,探究了部分难以理解的C++语法,帮助理解面向对象的封装思想

2024-07-14 20:33:14 1272

原创 C++类和对象——入门

后C++引入class(此时还不叫“C++”,而是“C with Classes”,在1983被正式更名为C++),可以理解为一个可以定义函数的结构体(二者略有不同)由inline修饰的函数会在编译阶段于调用函数处展开,并不会调用函数(这种情况仅在被inline修饰函数的内容较少时出现,具体由编译器判断)类的大小为成员变量之和,但成员函数被放在公共代码段,不被算入大小,空类大小为一。对象则是其具体化实现、是类的实例,具体实现类定义的属性和行为。类的成员变量是另一个类的实例,上述代码中;

2024-06-16 23:06:15 929

原创 C++引用——类型+&+对象

事实也确实如此,在C++语法中,引用无法重新被赋值。返回值如果为非引用类型,编译器就会创建一个临时变量来持有返回值,引用类型返回值则不会(具体原因和证明就不再赘述,以后再详细展开吧)所以为了追求极致的性能,C++在能用的地方肯定是选择引用类型的返回值。但引用不一样,如果引用不进行初始化,代码是直接无法运行,并且引用的初始化赋值只能是一个对象,无法用NULL或者是nullptr对其初始化。并非如此,用引用变量接收后,它就变成了一个纯正的引用变量,编译器会自动处理,不再像指针一样需要自己去进行解引用操作。

2024-06-14 00:36:10 1535

原创 C++函数重载——拙见

原因分析:main函数位于.cpp文件之中,自然按照.cpp语法编译,此时的Add函数被重载为Add@@YAHHH@Z,Add函数的实现在.c文件中,按照c语法编译为Add。代码经过预处理->编译->汇编,到链接时,主函数用Add@@YAHHH@Z去找.c文件之中的Add,能找到吗?例如:main函数位于test.cpp文件,且main函数前已申明Add函数。用extern "C"声明函数,编译器就会以C的标准去编译这个函数,自然也就能用Add去找到Add函数的地址。

2024-06-10 01:26:47 495

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除