自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++课程设计——图书管理系统

四百多行实现一个C++课程设计,实现一个图书管理系系统,读者添加,图书添加,查询,借阅,归还,打印读者和图书信息,功能俱全!适合新手!

2023-10-10 23:54:15 412

原创 手写一个llvm的mem2reg pass

command。

2023-04-05 23:49:07 535 1

原创 Perf的安装与简单使用

Perf的安装与简单使用。

2022-08-17 11:10:02 12780

原创 实现一个shared_ptr和unique_ptr来深入了解C++11 的“最小GC”特性

C++11新特性的智能指针,是C++提供的最小垃圾回收的机制,是一个模板,可以管理指针,并实现自动释放的效果,抹开标准库中对于其它场景的思考, 其核心原理是机制,即对于对象的清理在于其引用的个数进行判断,如果没有对象引用这个堆空间,即的时候,就会将其释放。而是独占, 无法拷贝和赋值,只能以移动语义传播,下面是一个简化版的和模板,用于理解和的运行原理...

2022-06-29 17:11:37 361

原创 CRTP奇异递归模型——用普通函数的性能来实现C++的多态性(静态多态)

**CRTP (奇异递归模板)**能以一种小于虚函数开销的方式来实现多态,但是这种多态是静态多态,就是类型的确定时发生在编译期的,这种写法能减小虚函数的性能开销,但是他的缺陷是不适用于哪些运行时的多态,即类型是在运行时才能确定的情况是不适用于静态多态的。比如如下一段代码这就是一个简单的利用虚函数来实现多态,这种多态的实现是利用在和来进行具体函数的跳转,是一种运行时的动态多态优点很明显,能封装具体的类型,通过一个统一的接口而调用不同方法,但是实现虚函数需要的性能开销相比于普通函数,往往是普通函数的几倍。而对

2022-06-29 15:50:20 201

原创 C++11新特性——基于范围的for循环

了解这个c11新特性,写出高性能的遍历代码!

2022-06-22 00:44:36 603

原创 一文深入理解C++运算符的重载

一文帮助深入理解C++运算符的重载声明Rational有理数类运算符重载是C++的一个十分有意思的特性,能使除了基本变量之外的,其他的C++类声明也能实现基本的运算,下面将从一个有理数类Rational的实现与扩展,在这个类的深入设计过程中思考运算符的运用,以达到深入理解C++运算符重载的目的,有理数Rational相比于double能更精确地表示一个数据,实现一个Rational类能提供一种精确表达的方法, 但是Rational并不是C++的基本类型,需要我们手动实现,下面为Rational用例图的定

2022-04-11 13:25:30 1035

原创 C++使用ANTLR4

Antlr4 For C++ In LinuxAntlr是什么Antlr实际上做了两件事,一是翻译语法和词法,并生成相应代码,然后就是为翻译出来的语法词法代码提供运行时的支持将Antlr4放入Linux首先要确保Linux下有JDK环境,检查一下JVM是否存在,没有的话需要安装一下下载Antlr的jar包,去Antlr的官网下载即可Download ANTLR拿到jar包之后,在环境变量中添加这个jar包# 假如我们已经下载了jar包,并知道他的位置,我是放到了/usr/local/l

2022-03-28 14:31:39 4732 2

原创 一个简单的解释器

一个小型解释器

2022-03-21 23:39:08 304

原创 Linux下(Ubnutu)更换源

Linux下更换apt源(Ubnutu)的方法Ubnutu上更换apt源Ubnutu下apt查找deb软件的列表在etc/apt/sources.list中,可以先用cat命令查看里面的内容cat /etc/apt sources.list刨去文件中的注释,可以看到如下的内容,这个一个原装的Ubnutu18.04的sources.list里面的内容#deb cdrom:[Ubuntu 18.04.6 LTS _Bionic Beaver_ - Release amd64 (20210915)]/

2022-03-03 20:05:51 421

原创 Linux下更换gcc的版本

Linux下更换gcc的版本gcc编译器和g++编译器在哪里?gcc编译器和g++编译器的位置一般在/usr/bin/目录下,这是gcc和g++可执行文件的位置,也就是gcc main.cpp -o main这个命令的可执行文件调用的具体路径@ubuntu:~$ which gcc/usr/bin/gcc@ubuntu:~$ which g++/usr/bin/g++@ubuntu:~$ ls /usr/bin/gcc*/usr/bin/gcc /usr/bin/gcc-ar

2022-03-03 20:03:03 6425

原创 Dijkstra和Floyd算法

Dijkstra算法Dijkstra算法用于求解从图的一个点出发到任意一个点的最短距离的算法,他可用于求解正权图中的最短路径算法,不能够用于求解负权图,时间复杂度为O(n^2)算法思路构建三个集合,一个初始集合S,一个待求解集合U,一个距离集合WS集合存放已经找到最短路径的节点U存放还未找到最短路径的节点W中存放从起始节点出发到各个节点的最短路径的集合具体思路假设有a,b,c,d,e五个节点,从a节点出发寻找到b,c,d,e各个节点最短的节点,起始S = {a},U = {b,

2022-02-15 01:17:15 612

原创 C语言内存模型

C语言内存模型C语言程序的内存模型分为下面五个,分别为:text segmentdata segmentbssstackheaptext segment(代码段)text segment简称为文本段,又叫代码段(code segment),存放指令的地方,这一部分内存区域是可读(read - only)的,因为一个程序在被写好之后,其执行逻辑也是相同的。所以一般程序被加载到内存中来,其代码段有且仅被加载一次。无法改变data segment(数据段)data segment又称为

2022-02-05 10:29:50 1082 4

原创 C++指针

指针A pointer: It is a variable that store the memory address of the variable指针是一个变量,但是里面存储的是另一个变量的内存地址,里面存储的是一个变量的内存地址,它的大小与操作系统的位数有关,64位操作系统指针大小为8字节,32位为4字节不同类型的指针对于都是指向变量的首地址,其涵盖的地址范围是不一样的,int *p和long *p类型是不一样的通过指针获得值叫做解引用int a = 10;int *p = &amp

2022-02-05 00:19:36 689

原创 200行代码实现一个简易的计算器

200多行代码写一个能实现加减乘除的计算器中缀表达式和后缀表达式:1 + 3 * 5这样的表达式是中缀表达式,是一种日常的表达方法,能够便于理解其运算顺序其优点是整洁,字面意思便于理解缺点是需要考虑运算符的优先级1 3 5 * +这样的表达式是后缀表达式,他可以从中缀表达式转换过来,对于计算机,后缀表达式更方便计算,并且不需要考虑运算符优先级中缀表达式转换为后缀表达式中缀表达式转换为后缀表达式的方法为,以一个符号栈来存储符号,一个数组来存储后缀表达式的信息,从前往后扫描表达式的信息,

2022-01-16 20:58:18 820

原创 Unix/Linux进程间通信的方式

Linux进程间通信的方式Linux信号Linux信号是Linux进程间通信的一种古老的方式,是一种异步的通信方式,进程向另一个进程发送一个信号,另一个进程接收到信号之后会触发一个处理事件,比如说Ctrl+C中断。kill -l/-L:查看信号信息zouren@ubuntu:~$ kill -L 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKI

2022-01-10 16:52:03 515

原创 函数指针深入探索

函数指针再探问题提出函数指针的本质是什么?函数指针的效率和直接调用一样吗? 为什么?函数指针可以跟模板结合吗?函数指针可以作用于静态函数、成员方法、静态方法、纯虚函数、lamda吗?不能的话有什么方法解决?除了函数指针外还有哪些代码可以实现类似功能?探索函数指针本质是什么?引用维基百科上记录的对函数指针的定义,其上是这样说到的A function pointer, also called a subroutine pointer or procedure pointer is a

2022-01-10 01:14:27 349

原创 C++函数指针用法

C++函数指针详细理解函数指针初识函数指针是指向函数的指针,并不等于函数,它能够执行函数的操作,可以跟指针变量一起来理解,其基本声明格式为:type (*ptrname)(形参列表);例子,声明一个比较两个字符串大小的函数指针bool (*cp)(const string s1, const string s2);需要注意的是,**不要去掉括号!!!**如果去掉括号,含义就变成了返回一个bool指针的函数的声明!函数指针指向函数类型再使用函数指针时,函数指针可以发挥与函数相同的功效,即

2022-01-06 00:27:25 7216 2

原创 C++调试帮助

C++调试帮助assert断言头文件#include<cassert>格式assert(表达式);assert可用于在调试或测试程序时对程序运行环境进行判断,或者执行其它的一些辅助判断操作,比如辅助调试,帮助调试信息,如果assert里面的表达式返回0(false),程序会终止运行,如果表达式返回1(true),程序会什么也不做,接着执行后面的语句#include<cassert>#include<iostream>using namespace

2022-01-04 00:15:52 590

原创 C++构造函数初探

C++构造函数构造函数初始化列表构造函数格式ClassName(形参列表)初始化列表{ 函数体}区分初始化与赋值的概念初始化和赋值是两个不同的概念,两者之间会涉及到底层效率的问题int a = 10; // 这是对整型变量a进行初始化,就算后面没有=10,a还是会被初始化,初始值为0int b; // 初始化整型变量bb = 20; // 这是赋值操作从上面的代码可以看到,初始化和赋值完全是两个概念,前者直接初始化数据成员,后者是先初始化再赋值,多了一个步骤,所

2022-01-03 01:27:10 625

原创 C++类与对象——拷贝构造函数

C++拷贝构造函数问题引入#include<iostream>using namespace std;class A{public: A(int a,int b):a(a),b(b){} void printA(){ cout<<"class A.value a is:"<<a<<endl; } void printB(){ cout<<"class A.value

2022-01-01 02:56:20 344

原创 左值引用与右值引用

左值引用与右值引用**左值:**在一定作用域中是可以寻址的就叫左值,比如变量、函数返回的引用类型、函数返回的const类型int x = 10; // x是左值int& add(int a, int b){ return a+b;} // add函数返回的值是一个左值const int add1(int a, int b){ return a+b;} // add1函数返回的const类型也是一个左值**右值:**临时的,不可以寻址的,只用于临时存储

2022-01-01 00:58:10 55

原创 C++11多线程

C++11多线程C++11标准,头文件thread,可用于简单地创建一个可单独执行的执行单元,用gcc编译器在编译的时候因为Linux标准库中是不默认包含pthread.a静态库的,需要在编译选项后面添加-lpthread选项# 比如程序为main.cpp,要生成main_exe可执行文件# gcc命令为# 需要在后面添加lpthread选项g++ -o main_exe main.cpp -lpthread 构造函数thread用于创建一个单线程的对象类型为thread`,可用其定义

2021-12-30 10:27:48 748

原创 工具——C语言内联汇编(Inline Assembly)原来是这样的

Inline Assembly(C语言内联汇编)What is C program Inline Assembly(C语言内联汇编)C语言内联汇编是在高级语言内部嵌入汇编代码的成分,再实现某些功能的时候,C语言是一门高级语言,虽然它与其它语言相比,有着比较高的底层相容性,但是针对某些情形的境况还是不太够,而内联汇编正是解决了这个问题,让C语言可以利用汇编语言的硬件亲和性来亲近底层开发,这也是原来用C语言来开发操作系统的重要原因之一Inline Assembly‘s General Fomart (

2021-11-29 14:44:22 1496 1

原创 设计模式笔记——命令模式

设计模式笔记——命令模式基本介绍命令模式是与观察者模式都是行为型设计模式的一种,行为型模式注重于事情的响应性,当客户端触发一个事件之后,与操作相关的参数以对象的形式封装起来,提交给相应的处理对象解析执行,这个封装起来了的对象包含了执行这个操作所需要的全部信息,比如:方法名称拥有方法的对象方法参数的值比如一个安装向导程序,用户在界面上进行一些列的选项操作之后…,这些选项会封装到一个或多个对象中,提交到一个对象管理器中,一系列配置选项完成之后,点击Install,对象管理器就根据之前传入的参数配

2021-11-24 20:22:41 307

原创 编译原理学习笔记(五)——LL(1)算法学习

编译原理笔记(五)——语法分析LL(1)算法从基本自顶向下到LL(1)自顶向下的基本算法思想中,从一个文法推导出一个表达式,其伪代码为# 文法规则1# S -> N V N# N -> s# | t# | g# | w# V -> e# | d# 一个例子: g d w# what is 右部, 比如 S -> N V N,这是S的一个生成式,那么N V N就是S的这一条生成式的右部tokens[];i = 0;stack =

2021-11-24 13:20:56 1932 1

原创 Python的赋值、深拷贝、浅拷贝

Python的引用、浅拷贝、深拷贝引用只是给对象一个别名而已浅拷贝只拷贝父对象,而不拷贝子对象深拷贝不仅拷贝父对象,而且拷贝子对象# -*- coding=utf-8 -*-import copyif __name__ == "__main__": # 引用 print("引用") a = 10 b = a print(id(a)) # id是查看对象的地址的一个函数 print(id(b)) # 浅拷贝 print("

2021-11-23 17:16:27 499

原创 Python字符串对齐和格式化操作

Python格式化字符串和字符串对齐操作语法Python有两种格式化字符串的语法表示,一种是f"",另外一种是"{0} {1}...".formart(str1, str2)实例if __name__ == "__main__": a = 1 b = 2 print(f"{a} + {b} = {a + b}") print("{0} + {1} = {2}".format(a, b, a+b))1 + 2 = 31 + 2 = 3对齐ljust(int

2021-11-23 00:22:23 889

原创 编译原理笔记(四)——语法分析

编译原理笔记(四)——语法分析语法分析#mermaid-svg-Inj6Kk4k70evyNX5 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Inj6Kk4k70evyNX5 .label text{fill:#333}#mermaid-svg-Inj6Kk4k70evyNX5 .node rect,#m

2021-11-21 21:34:55 1062

原创 编译原理笔记(三)——DFA的代码表示

DFA的代码表示笔记DFA是一个有向图不同的代码表示转移表哈希表跳转表…​ 其构造却决与在实际实现中面对时间空间的权衡转移表以正则表达式为例a(b|c)*,其状态转移图为在C语言中可以用一个二维数组来表示状态/字符abc01errorerror1error11#define ERROR -1char table[M][N]; // 大小根据字符集的大小来确定 // init char tabletable[

2021-11-20 23:48:52 1358

原创 编译原理笔记(二)——正则表达式到有限状态自动机

编译原理笔记(二)——正则表达式和NFA、DFA转化原理#mermaid-svg-tRPiQapdJeShdcwB .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-tRPiQapdJeShdcwB .label text{fill:#333}#mermaid-svg-tRPiQapdJeShdcwB .node

2021-11-20 23:47:17 1002

原创 编译原理笔记——编译原理初识

编译原理学习笔记与实践(一)编译器编译器是一个将源代码转换到目标机器语言的一个程序,它是一个十分复杂的系统,概括的来说,可以以一张图来描述[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1h0seANa-1637422992349)(https://i.loli.net/2021/11/11/cRj47IJpqb3uPgM.png)]又有另外一区分法,将编译器整个拆解为前端、中端、后端,每个部分完成相应的工作[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来

2021-11-20 23:44:53 726

原创 设计模式笔记——代理模式

设计模式笔记——代理模式代理模式介绍代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方Web中的代理服务器就是一个例子,客户端向代理服务器发送网业请求,连接代理服务器,代理服务器评估请求,并将封装后的请求发送到相应的远程服务器,受到响应后,就将响应发送给客户端,在这个过程中,代理服务器起到了一个中介的作用,起到一个封装请求,保护隐私的作用非常适合在分布式架构中运行#mermaid-svg-rELqy75s4hDypqRy .label{font

2021-11-20 23:38:18 81

原创 设计模式笔记——观察者模式(村里二蛋偷偷取了个媳妇,村长知道了,然后全村都知道了...)

设计模式笔记——观察者模式观察者模式是一种行为模式,创建型模式关注的是对象的创建,将对象创建的过程与使用方分离开来,从而不需要让用户了解对象创建的细节,而结构型模式是用于设计对象和类的结构以及识别类和对象的关系,而对于行为型模式,他注重于对象之间的相互交互,并且这之间还是松耦合的,观察者模式就是最简单的一个行为型模式观察者模式观察者设计模式中:一个对象(主题)维护了一个依赖(观察者)列表,以便主题可以使用观察者定义任何地方通知所有观察者它所发生的变化,这个对象可以理解为一个核心主题,它影响着一系列

2021-11-20 23:35:03 608 2

原创 设计模式笔记——代理模式

设计模式笔记——代理模式代理模式介绍代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方Web中的代理服务器就是一个例子,客户端向代理服务器发送网业请求,连接代理服务器,代理服务器评估请求,并将封装后的请求发送到相应的远程服务器,受到响应后,就将响应发送给客户端,在这个过程中,代理服务器起到了一个中介的作用,起到一个封装请求,保护隐私的作用非常适合在分布式架构中运行#mermaid-svg-agSCIgCyfwrL9AFE .label{font

2021-11-16 00:33:00 354

原创 用门面模式讲一个浪漫的爱情故事,实现一场美好的婚礼

设计模式笔记——门面模式门面设计模式基本介绍门面设计模式是一种结构型模式,通俗的来说(个人观点):门面(Facade)指的是建筑物的表面,尤其指的是最有吸引力的那一面,可以表示一种容易让人误解某人的真实感受或情况的行为和面貌,当人们从建筑物的表面路过时,会被眼前美丽的表面所吸引,却不了解内部的结构的复杂性,这就是门面模式,在隐藏内部复杂性的同时,为客户端提供一个接口,使其能轻松的访问系统,进行相应的处理就好比去超市买东西,**琳琅满目的商品(复杂的系统)在一个偌大的空间中摆放着,而我们(客户端)需要

2021-11-12 01:31:26 536

原创 可变参数头文件<stdargs.h>使用

可变参数头文件stdarg.h#include<stdarg.h> // 导入这个库,允许函数里面定义非固定长度的可变参数三个宏和一个变量类型va_list: 保存传入的参数数据va_start: 一个宏定义va_arg: 一个宏定义va_end: 一个宏定义// 用法type method(type1 arg1, type2 arg2, type3 lastarg, ...){ // ... 代表不定参数,其前面的lastarg就是最后一个确定参数

2021-11-10 20:06:37 858

原创 正则表达式——笔记

正则表达式练习网站正则测试网站正则练习题网站基本内容字符组[]:表示匹配字符集里面的字符任意一次# [Pp]ython--> [Pp]表示匹配一个大写的P或小写的P--> 上面的正则表达式就可以匹配Python和python字符横杠-,放在字符组里面表示范围# [0-9a-zA-Z]--> 表示匹配任意一个数字、小写字母、大写字母--> [0-9]可以理解为[0123456789],只是第二种写法太操蛋了,如果a到z的话那岂不是得写26个字符

2021-11-10 09:42:16 347

原创 设计模式笔记——工厂模式

设计模式笔记——工厂模式1、介绍“工厂”是一个负责创建其他类型对象的类,通常一个工厂的类有一个对象并且管理多个方法,客户端通过调用工厂的创建方法来创建特定的对象,在此,客户端就不需要知道这个对象具体是什么,而只需要知道传入什么参数,能用这个对象的什么接口就行了优点所在松耦合,对象创建独立于类的实现客户端无需了解创建的类,也可以创建对象可以轻轻松松的在工厂中添加其他类型的对象,并无需大改客户端代码,最简单的时候只需要改一个参数就可以了可重用现有对象2、简单工厂模式现有一个ani

2021-11-09 19:48:50 83

原创 设计模式——单例模式

设计模式笔记面向对象编程的基本概念封装对象的行为对于外部世界是不可见的,是私密的多态根据输入参数提供方法的不同实现不同类型的对象可以使用相同的接口继承继承表示一个类可以使用父类(基类)的大部分功能,被描述为一个重用基类中定义的功能并允许对原始软件的实现进行独立扩展的选项class Base(object): def base(): pass class B(Base): def b(): pass

2021-11-07 22:29:55 82

空空如也

空空如也

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

TA关注的人

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