当前位置: 首页 > news >正文

Liunx开发工具

Liunx开发工具

  • 1.Linux编辑器-vim使用
    • 1.1vim的基本概念
    • 1.2vim的基本操作
    • 1.3命令模式命令集
      • 1.3.1光标定位
      • 1.3.2光标移动
      • 1.3.3文本复制
      • 1.3.4文本操作
    • 1.4插入模式命令集
    • 1.5底行模式命令集
  • 2.vim配置
  • 3.sudo配置
  • 4.Linux编辑器-gcc/g++使用
    • 4.1背景知识
    • 4.2gcc如何操作
  • 5.函数库
    • 5.1函数库的分类
  • 6.Liunx调试器-gdb使用
    • 6.1背景知识
    • 6.2gdb命令集
  • 7.Linux项目自动化构建工具-make/Makefile
    • 7.1背景
    • 7.2makefile原理
    • 7.3初步理解makefile的语法
    • 7.4两个问题
    • 7.5makefile推导规则

我们编写C/C++程序使用vs,编译,运行,调试都是一体的,而在Liunx都分开的。

1.Linux编辑器-vim使用

vi/vim 是 Linux 系统内置的不可或缺的文本编辑命令,vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。我们主要学vim。

1.1vim的基本概念

这里主要讲解vim的三种模式(其实有好多模式,目前掌握这3种即可),分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+; 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入:

help vim-modes

1.2vim的基本操作

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:
在这里插入图片描述
不过有一点要特别注意,就是你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字

[正常模式]切换至[插入模式]
输入a
输入i
输入o

[插入模式]切换至[正常模式]
目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。

[正常模式]切换至[末行模式]
「shift + ;」, 其实就是输入「:」
退出vim及保存文件,在[正常模式]下,按一下「:」冒号键进入「Last line mode」,例如:
: w (保存当前文件)
: wq (输入「wq」,存盘并退出vim)
: q! (输入q!,不存盘强制退出vim)

在这里插入图片描述

1.3命令模式命令集

1.3.1光标定位

光标移到改行最右边

shift + 4 -----> $

光标移到改行最左边

shift + 6 -----> ^

光标到结尾

shift + g -----> G

光标到开头

gg

跳转光标到指定行,n代表的是行号

n+shift+g

1.3.2光标移动

h

j

k

l

向后按照单词移动

w

支持 nw

向前按照单词移动

b

支持 nb

1.3.3文本复制

执行的是光标所在行位置

复制

yy

默认复制一行

nyy

支持光标所在行,进行多行复制 n是行数

粘贴

p

光标在哪里,就向哪里粘贴。默认一次

np

支持对内容,进行多行粘贴

撤销

u

删除

dd

删除光标所在行

ndd

支持光标所在行,进行多行删除

剪切

dd+p

在光标所在行进行剪切

ndd+p

支持多行剪切

取消u操作

ctrl+r

1.3.4文本操作

文本行大小写转换

shift+~

文本行批量化替换(当前行文本写错,不想删除,直接shift+r,换一行内容)

shift+r

shift+r其实由命令模式切换到替换模式

替换光标所在行的一个字符

r

替换光标所在行n个字符,只能换成一样的

nr

替换光标所在行的字符,随意替换

R

行内删除,向后删除一个字符

x

向后删除n个字符,包括光标所在位这个位置

nx

向前删除一个字符

shift+x ------>X

向前删除n个字符,不包括光标所在位这个位置

n+shift+x

剪切操作

nx+p

删除光标所在行的单词,并进入插入模式

cw

删除光标所在行n个单词,并进入插入模式

cnw

1.4插入模式命令集

命令模式切换到插入模式

i/a/o

1.5底行模式命令集

调出/取消行号

set nu/nonu

强制退出

q!

强制写入

w!

强制写入并退出

wq!

分屏

vs 文件名

在这里插入图片描述

无论分多少屏幕,光标只有一个!!光标的意义:选中当前行(编辑的位置)或者屏幕。

光标跨屏幕

ctrl+ww

有了这个指令,就可以尝试在不同文件里进行其他操作了

不退出vim,执行Liunx命令

!+指令

在这里插入图片描述
按q退出

替换

%s/前/后/g

把文件里属于前的内容全部用后的内容替换

在这里插入图片描述在这里插入图片描述

2.vim配置

1.vim配置是一人一份的,一个用户配置的是自己的,不影响别人。
2.每个人虽然用的都是同一个vim程序,但是大家用的是不同的vim配置,这是因为每个用户,在自己家目录下配置,这样就是独属于自己的配置了。

vim的基本配置
在自己家目录下创建一个.vimrc文件,在里面配置
在这里插入图片描述
在这里插入图片描述
打开文件,会自动显示行号
在这里插入图片描述
感兴趣可以到网上搜索一下vim配置,配置属于你自己的那一份。

这里有一份别人配置好的,分享给大家。
vim配置

往下翻,找到这个,复制这条命令,在自己家目录下执行这条命令
在这里插入图片描述
输入root密码,然后等待安装
在这里插入图片描述
在这里插入图片描述
这样就配置就完成了。自己上手看一下效果,
在这里插入图片描述
这里就是我们配置好的文件,不要删除,保留即可
在这里插入图片描述
这里配置Tab有一点点问题,打开.vimrc文件
在这里插入图片描述
找到这里把2,都修改成4,保存退出,这样完整的一份vim就好了。
在这里插入图片描述
在这里插入图片描述

3.sudo配置

1.先把自己切换成root
在这里插入图片描述
2.编辑sudoers文件
在这里插入图片描述
找到这里,复制粘贴一下,然后强制保存退出,
在这里插入图片描述
在sudo提权的时候,输入一下自己的密码就可以正常使用了。

4.Linux编辑器-gcc/g++使用

4.1背景知识

我们知道程序编辑完,ctrl+F5就会把编译和链接都完成了。但是编译到链接又分了几个步骤:
1.预处理(头文件展开,去注释,宏的替换,条件编译)
2.编译(把c语言变成汇编语言)
3.汇编(把汇编语言生成二进制指令)
4.链接(将目标文件和链接库进行链接生成可执行文件)

4.2gcc如何操作

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

以下面这段代码为例

在这里插入图片描述

1.直接完成编译和链接过程生成可执行程序

gcc test.c

在这里插入图片描述
a.out就是可执行程序

./a.out

执行可执行程序
在这里插入图片描述

2.依次处理编译和链接过程

预处理
预处理功能主要包括头文件展开,去注释,宏的替换,条件编译等。
预处理指令是以#号开头的代码行。
实例:

gcc –E test.c –o test.i

选项“-E”,该选项的作用是从现在开始,进行程序的翻译,当预处理完成之后,就停下来
选项“-o”是指形成的临时文件,“.i”文件为已经过预处理的C原始程序

编译
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
实例:

gcc -S test.i -o test.s

选项“-S”,该选项的作用是从现在开始,进行程序的翻译,做完编译工作,变成汇编语言后就停下来。

汇编
汇编阶段是把编译阶段生成的“.s”文件转成目标文件(该目标文件不是可执行文件,只是二进制目标文件)
实例:

gcc -c test.s -o test.o

选项“-c”,该选项的作用是从现在开始,进行程序的翻译,做完汇编工作,编程二进制目标文件就停下来

下面指令,可以查看二进制指令

od test.o

做完上面的工作,一定不能忘记链接的过程,因为上面的只是在编译你的代码,就比如说printf是一个库函数,我们直接就使用了,头文件展开只是告诉这个函数怎么用,有这个函数。并没有定义它,必须要去库里面找。

链接
把自己写的代码与C标准库的代码合起来形成可执行程序
实例:

gcc test.o -o mytest

指定可执行程序名称

gcc test.o 

形成可执行程序默认名称为a.out

如果想执行C++代码,把gcc换成g++

5.函数库

就如上面所说,printf我们并没有去定义实现它,头文件包含了对该函数的声明,而没有定义函数的实现,那么是在哪里实现printf函数的呢?

答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

5.1函数库的分类

链接的本质:就是我们调用库函数的时候,和标准库如何关联的问题。

函数库分为动态库和静态库。
在这里插入图片描述
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。

动态库和静态库优缺点:
优点:
动态库:形成的可执行程序小,节省资源(内存,磁盘,网络)。
静态库:不受库升级或者被删除等影响。

缺点:
动态库:受到库升级或被删除等影响
静态库:形成可执行程序太大

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

file mytest

在这里插入图片描述

查看可执行程序依赖的动态库列表

ldd mytest

在这里插入图片描述

动态库
libxxx.so
lib前缀
.so后缀
去掉前缀和后缀,剩下的就是库名称

静态库
libxxx.a
lib前缀
.a后缀

Liunx下默认形成可执行程序使用“动态库”

动态

gcc test.c -o mytest

静态(需要指定)

gcc test.c -o mytest -static

注意

如果系统中只提供.so文件,只能用动态链接,或者只提供.a文件,即使不指定static也是静态链接。如果动静态库都有,默认使用动态库。

一般而言,系统会自动携带动态库的,这是因为系统的运行就需要动态库。静态库如果不存在需要自己手动安装。

安装C静态库

sudo yun install -y glibc-static

安装C++静态库

sudo yum install -y libstdc++-static

关于Liunx的动静态库的问题,在windows下原理是一样的。
默认形成可执行程序:动态链接

windows下动态库后缀.dll,静态库后缀.lib

注意:系统本身为了支持我们编程,除了提供标准库.h,还提供了标准库的实现.so/.a

6.Liunx调试器-gdb使用

Liunx和windows调试方式不一样,但调试思路是一样的。
Liunx是使用gdb命令行调试

6.1背景知识

1.程序的发布方式有两种,debug模式和release模式。
2.Linux gcc/g++出来的二进制程序,默认是release模式。gdb不能直接对release模式下发行的程序进行调试,需要改成debug模式下发行的程序。
3.生成debug模式下的程序,必须在源代码生成二进制程序的时候, 加上 -g 选项

总结:

gcc默认行为
1.默认动态链接
2.默认release模式

vim默认行为
1.默认打开就是命令模式

开始调试

gcc test.c -g -o mytest
gcc mytest

退出调试

q

6.2gdb命令集

下面命令都是简写,也可以使用完整的命令

显示代码
list

l

从0行开始显示代码

l 0

这里显示代码并不会完全显示出来,再按回车键继续显示

在n行设置断点
break

b n

查看断点

info b

删除断点
delete

d 编号

在这里插入图片描述

调试运行,跑到断点处
run

r

逐过程
next

n

逐语句
step

s

跳转到下一个断点处
contiue

c

查看函数调用堆栈

bt

执行当前函数返回,然后停下来等待命令

finish

在这里插入图片描述

查看变量/地址
p,只显示一次

p 变量/地址

常显示

display 变量/地址

取消常显示

undisplay 编号

跳转到指定行

until n

修改变量的值
i是变量

set var i=100

显示当前栈帧局部变量的值

info locals

禁用断点

disable breakpoint 编号

启用断点

enable 编号

7.Linux项目自动化构建工具-make/Makefile

7.1背景

1.会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
2.一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
3.makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
4.make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5.make是一条命令makefile是一个文件,两个搭配使用,完成项目自动化构建。

7.2makefile原理

makefile存在的意义:是为了构建项目(做一件事情)。
构建项目需要:1.依赖关系 2.依赖方法

比如,要做一件事情,找你爸要钱。
a.表明依赖关系(我是你的儿子/女儿)
b.表面依赖方法(你得给我转钱)

7.3初步理解makefile的语法

在代码路径下创建一个makefile文件
在这里插入图片描述
在这里插入图片描述

第一行依赖关系,:左边目标文件/可执行程序:右边依赖文件列表
第二行依赖方法,必须以Tab键开头

依赖关系:目标文件/可执行程序与源文件互相依赖关系
依赖方法:根据依赖关系,从依赖文件列表生成目标文件/可执行程序

有了可执行程序,还需要一个删除可执行程序指令。

在这里插入图片描述
clean不需要依赖

.PHONY被该关键字修饰的对象是一个伪目标,该目标总是可以被执行

在这里插入图片描述

再看下面图片,对比一下两张图片
在这里插入图片描述

发现只能make一次,make clean可以执行多次,gcc是如何得知,我不需要编译了呢?

stat 文件名(查看文件属性)  

在这里插入图片描述

Access:文件被访问的时间
Modify:文件内容被修改的时间
Change:文件属性被修改的时间

在这里插入图片描述
在这里插入图片描述

修改文件内容的时候,发现文件属性也变了,这是为什么?
因为文件大小变量,属性也就变了。文件属性包括:文件名,类型,大小。。。

至于大家看到Access也变了,下面就解释。

在看下面一张图片
在这里插入图片描述

当我们读取内容的时候,发现有的时候Access时间不变,这是为什么呢?
首先回答,文件操作时,改文件内容多,还是访问多?
肯定时访问多。如果一访问就修改Access的时间,需要进行多次IO操作,其次没人会关心访问文件多少次。

因此,一段时间访问次数够了,Access才会变。

gcc是根据对比源文件和可执行程序的Modify时间的新旧来判断,来判断可执行程序是否重新编译。
源文件比可执行程序时间旧,就不用重新编译,如果新就重新编译。

因此凡是被.PHONY修饰的,不再根据对比modify时间新旧的策略,而是总是执行一次。

7.4两个问题

问:
为什么make,就可以执行makefile第一条规则,执行第二条规则必须make clean?
答:
make默认从上到下扫描文本,默认第一个被扫描的目标文件,可以省略名称。

问:
make为什么走完第一条规则就不往下走了?
答:
默认情况下makefile只形成一个目标文件,后续的依赖关系和依赖方法不再执行,默认从上到下扫描只执行第一个。默认不指定就执行第一个。

7.5makefile推导规则

mytest:test.c

其实mytest并不直接依赖test.c

真实情况是这样

mytest:test.ogcc test.o -o mytest
test.o:test.sgcc -c test.s -o test.o
test.s:test.igcc -S test.i -o test.s
test.i:test.cgcc -E test.c -o test.i

mytest依赖test.o,test.o不存在因此不执行依赖方法,然后去找test.o。。。。最后test.i依赖test.c,test.c存在执行依赖方法,然后层层返依次执行。

但是不推荐这样写,直接mytest:test.c,下面跟着依赖方法就行了。

自此关于Liunx编辑器vim,编译器gcc/g++,调试器gdb,vim配置,sudo配置,以及简单了解Liunx项目自动化构建工具make/makefile到这里暂时告一段落。

觉得有帮助的,点赞,评论,收藏,谢谢!!!

在这里插入图片描述

相关文章:

Liunx开发工具

Liunx开发工具 1.Linux编辑器-vim使用1.1vim的基本概念1.2vim的基本操作1.3命令模式命令集1.3.1光标定位1.3.2光标移动1.3.3文本复制1.3.4文本操作 1.4插入模式命令集1.5底行模式命令集 2.vim配置3.sudo配置4.Linux编辑器-gcc/g使用4.1背景知识4.2gcc如何操作 5.函数库5.1函数库…...

Docker入门之运行Nginx案例

运行镜像 如果你直接安装会比较慢, 建议参照附录内容配置镜像之后再执行 # 执行命令过程一:下载容器镜像 docker run -d nginx:latest 命令解释 docker run 启动一个容器 -d 把容器镜像中需要执行的命令以daemon(守护进程)的方式运行 nginx…...

【深度学习环境】安装anaconda、tensorflow、pycharm

目录 1.安装anaconda 2.安装tensorflow-gpu 3.安装pycharm 4.VNC操作 5.安装Pytorch PS: linux下常见的操作: 1.Linux下强制关闭程序: 2.导出环境 2.1.pip导出 2.2.conda导出 2.3.其他 3.windows下的环境安装 & pycharm远程配置 4.bash…...

mockery 模拟

composer地址:mockery/mockery - Packagist github地址:地址 文档地址:Mockery — Mockery Docs 1.0-alpha documentation 根据文档介绍,mockery是php mock对象框架。根据js的mock框架的作用,估计mockery也是通过创…...

汽车后视镜反射率检测系统

随着社会的快速发展和物质生活的提供,机动车越来越普及,道路行车安全日益重要。为了保障机动车辆和行人的安全,在行车时不断观察后方和两侧的图像尤为重要。机动车后视镜通过反射镜面可以提供在规定视野内后方和两侧的图像,从而提…...

uni-app引用外部图标库(阿里矢量图)

uni-app引用外部图标库(阿里矢量图) 作为前端程序员,nui-app是必备的,但是有时候内置的图标,组件又不完全满足,这里就可以引进外部图标,这里引用的是阿里矢量图标 第一步,在项目目…...

day49-Todo List(待办事项列表)

50 天学习 50 个项目 - HTMLCSS and JavaScript day49-Todo List&#xff08;待办事项列表&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" co…...

寻找丢失数字:数学与位运算的解密之旅

本篇博客会讲解力扣“268. 丢失的数字”的解题思路&#xff0c;这是题目链接。 注意进阶中的描述&#xff1a;你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题&#xff1f;这里我会讲解两种思路&#xff0c;它们的时间复杂度是O(N)&#xff0c;空间复杂度是O(1)…...

数论分块学习笔记

准备开始复习莫比乌斯反演&#xff0c;杜教筛这一部分&#xff0c;先复习一下数论分块 0.随便说说 数论分块可以计算如下形式的式子 ∑ i 1 n f ( i ) g ( ⌊ n i ⌋ ) \sum_{i1}^{n}f(i)g(\lfloor\frac{n}{i}\rfloor) ∑i1n​f(i)g(⌊in​⌋)。 利用的原理是 ⌊ n i ⌋ \lf…...

【基础理论】了解点过程

Maximum tsunami wave height generated by the 16 Sept. 2015 Chile earthquake, from the International Tsunami Information Center. Posted by Austin Elliott 一、说明 在这个世界上&#xff0c;会发生许多事件&#xff0c;其趋势可能遵循一种模式。在这篇博客中&#…...

深入理解Spring MVC中的@ResponseBody注解

引言 在现代的Web应用开发中&#xff0c;数据的传递和交互是不可或缺的一部分。Spring MVC作为一个强大的框架&#xff0c;在处理客户端请求和响应时&#xff0c;提供了许多注解来简化开发过程。其中&#xff0c;ResponseBody注解在处理方法的返回值时起到了关键作用&#xff0…...

大数据学习教程:Linux高级教程(下)

四、大数据集群服务器搭建 1. 新增Linux服务器 1.1、克隆虚拟机 学习环境中&#xff0c;一般使用VMware虚拟机克隆Linux系统&#xff0c;用来进行集群服务器的搭建。 VMware支持两种类型的克隆&#xff1a;完整克隆、链接克隆 完整克隆是和原始虚拟机完全独立的一个复制&…...

1.Oracle建表及使用

1.概述 1. 表&#xff1a;用于 存储数据 -- 是我们最常见的数据库对象 2. 表设计注意事项 (1) 表设计时&#xff0c;尽量遵从 第三范式&#xff08;3NF&#xff09; (2) 名称不能超过 30 个字符 -- 超过会报错 (3) 名称只能以 字母 大头&#xff0c;可由数字、 _、 $…...

《网络是怎样连接的》(二.2)

(6条消息) 《网络是怎样连接的》&#xff08;二.1&#xff09;_qq_38480311的博客-CSDN博客 本文主要取材于 《网络是怎样连接的》 第二章 2.5 2.6章节。 目录 简述&#xff1a; 本文的主要内容是 以太网的收发操作 和 UDP协议的收发操作。 IP与以太网的包收发操作 包是什…...

MySQL加密插件安装

加密插件 查看已经安装的插件&#xff1a;show plugs; 增加加密插件&#xff1a; 登陆MySQL后&#xff0c;通过show variables like ‘validate%’;查看相关验证规则。 ① 在配置文件中新增&#xff0c;[mysqld]标签下 plugin-load-addvalidate_password.so ② 在运行时新增…...

新手入门Jenkins自动化部署入门详细教程

1. 背景 在实际开发中&#xff0c;我们经常要一边开发一边测试&#xff0c;当然这里说的测试并不是程序员对自己代码的单元测试&#xff0c;而是同组程序员将代码提交后&#xff0c;由测试人员测试&#xff1b; 或者前后端分离后&#xff0c;经常会修改接口&#xff0c;然后重新…...

Neural Network学习笔记4

完整的模型训练套路 train.py import torch import torchvision from torch.utils.data import DataLoader # 引入自定义的网络模型 from torch.utils.tensorboard import SummaryWriterfrom model import *# 准备数据集 train_data torchvision.datasets.CIFAR10(root"…...

[转]关于cmake --build .的理解

https://blog.csdn.net/qq_38563206/article/details/126486183 https://blog.csdn.net/HandsomeHong/article/details/120170219 cmake --build . 该命令的含义是&#xff1a;执行当前目录下的构建系统&#xff0c;生成构建目标。 cmake项目构建过程简述: 1. 首先&#xf…...

【Linux下6818开发板(ARM)】硬件空间挂载

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…...

剑指offer 动态规划篇

题目由入门往上递增 入门 斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 动态规划甚至于算法的入门题目 方法一&#xff1a;按照斐波那契的公式fnfn-1fn-2&#xff0c;从1-n求出结果。 class Solution { public:int Fibonacci(int n) {vector<int>f{0,1,1};for(int …...

关于Linux中前端负载均衡之VIP(LVS+Keepalived)自动化部署的一些笔记

写在前面 整理一些 LVS 相关的笔记理解不足小伙伴帮忙指正 傍晚时分&#xff0c;你坐在屋檐下&#xff0c;看着天慢慢地黑下去&#xff0c;心里寂寞而凄凉&#xff0c;感到自己的生命被剥夺了。当时我是个年轻人&#xff0c;但我害怕这样生活下去&#xff0c;衰老下去。在我看来…...

C++ 拷贝交换技术示例

拷贝交换技术&#xff08;copy and swap&#xff09;是什么&#xff0c;网上估计能查到很多。但网上有点难找到完整的演示代码&#xff0c;所以这里记录一下。难点在于&#xff1a; 如果要满足 5 的原则&#xff0c;我到底要写那些函数&#xff1f; 默认构造函数、复制构造函数…...

使用 Go 语言实现二叉搜索树

原文链接&#xff1a; 使用 Go 语言实现二叉搜索树 二叉树是一种常见并且非常重要的数据结构&#xff0c;在很多项目中都能看到二叉树的身影。 它有很多变种&#xff0c;比如红黑树&#xff0c;常被用作 std::map 和 std::set 的底层实现&#xff1b;B 树和 B 树&#xff0c;…...

系统接口自动化测试方案

XXX接口自动化测试方案 1、引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 XXXXX&#xff0c;XXX 所属部门 XX 备注 1.3 文档目的 本文档主要用于指导XXX-Y…...

小研究 - JVM 垃圾回收方式性能研究(一)

本文从几种JVM垃圾回收方式及原理出发&#xff0c;研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响&#xff0c;并通过最终测试数据对比&#xff0c;给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 1 引言 2 垃圾回收算法 2.1 标记清除法 2.2…...

[LeetCode]链表相关题目(c语言实现)

文章目录 LeetCode203. 移除链表元素LeetCode237. 删除链表中的节点LeetCode206. 反转链表ⅠLeetCode92. 反转链表 II思路 1思路 2 LeetCode876. 链表的中间结点剑指 Offer 22. 链表中倒数第k个节点LeetCode21. 合并两个有序链表LeetCode86. 分隔链表LeetCode234. 回文链表Leet…...

[深入理解NAND Flash (操作篇)] NAND 初始化常用命令:复位 (Reset) 和 Read ID 和 Read UID 操作和代码实现

依JEDEC eMMC及经验辛苦整理,原创保护,禁止转载。 专栏 《深入理解Flash:闪存特性与实践》 内容摘要 全文 4400 字,主要内容 复位的目的和作用?   NAND Reset 种类:FFh, FCh, FAh, FDh 区别 Reset 操作步骤 和 代码实现 Read ID 操作步骤 和 代码实现 Read Uni…...

RxJava 复刻简版之二,调用流程分析之案例实现

接上篇&#xff1a;https://blog.csdn.net/da_ma_dai/article/details/131878516 代码节点&#xff1a;https://gitee.com/bobidali/lite-rx-java/commit/05199792ce75a80147c822336b46837f09229e46 java 类型转换 kt 类型&#xff1a; Any Object泛型&#xff1a; 协变: …...

SpringMVC中Model和ModelAndView的区别

SpringMVC中Model和ModelAndView的区别 两者的区别&#xff1a; 在SpringMVC中&#xff0c;Model和ModelAndView都是用于将数据传递到视图层的对象 Model是”模型“的意思&#xff0c;是MVC架构中的”M“部分&#xff0c;是用来传输数据的。 理解成MVC架构中的”M“和”V“…...

Tomcat安装与管理

文章目录 Tomcat安装及管理Tomcat gz包安装&#xff1a;JDK安装&#xff1a;Tomcat安装&#xff1a;修改配置文件&#xff08;如下&#xff09;&#xff1a;服务启动配置&#xff1a; Tomcat-管理(部署jpress)&#xff1a;修改允许访问的主机修改允许管理APP的主机进入管理&…...