C++内存管理
四种内存分配和释放的方式
分配
释放
类型
是否可重载
malloc
free
C-function
否
new
delete
C+±expressions
否
::operator new()
::operator delete()
C+±function
可
allocator::allocate()
allocator::deallocate()
C+±STL
可自由设计并且搭配任何容器
memory primitives
malloc
free
不可重载
new
delete
不可重载
::operator new()
::operator delete()
可重载
allocator::allocate()
allocator::deallocate()
可以自由设计并搭配任何容器
new expression
new 有两个作用,申请内存→构造函数,申请内存使用 operator new 实际上使用的还是 malloc 函数来申请内存
12345678910111213141516Complex *pc = new ...
C++程序的生前死后
startup
默认的startup函数是由 linker(连接器) 自己选择的
1. 内存初始化
内存块:
从哪里来
大小多少
回收到哪
SBH(Small Block Heap):应付CRT本身以及main进去之后的所有内存(size=1024=1k)。
如果客户要的区块大小要小于sbh_threshold(size=1016,加上图中的上下的00000131(各占4个字节),1016+8=1024,即1K),将从sbh内部去申请内存。反之,使用HeapAlloc(win提供的API函数),让操作系统提供服务。
因此,内存小于等于1K的,VC6认为它足够小,它将使用SBH去服务它。反之,若大于1K,将有操作系统那些"池塘"(HeapAlloc等函数)来提供。(内存块从哪里来)
HeapAlloc:HeapAlloc是Windows提供的API,在进程初始化的时候,系统会在进程的地址空间中创建1M大小的堆,称为默认堆(Default Heap),该大小为默认值,可以通过/HEAP连接器开关进行修改。用户也可以通过HeapCreate创建额外的堆,堆的使用可以 ...
C++11STL
STL 六大部件
容器 Container
分配器 Allocators 用于为算法分配地址
算法 Algorithms
迭代器 Iterators 容器中就会有迭代器,用于遍历元素,就是可以表示容器中的所有种类的元素
适配器 Adapters 就像是一个泛化的指针, 对迭代器,仿函数,容器进行适配
仿函式 Functors 就是一种函数
数据在容器里,操作数据的函数在另外的类里
时间复杂度(Big-oh)
O(1),O(c)O(1),O(c)O(1),O(c) : 常数时间
O(n)O(n)O(n) :线性时间
O(lognx)O(\log_n x)O(lognx) :次线性时间
O(n2)O(n^2)O(n2) :平方时间
O(n3)O(n^3)O(n3) :立方时间
O(2n)O(2^n)O(2n) :指数时间
O(nlog2n)O(n\log_2n)O(nlog2n) :线性与二次方成长之间的模式
容器
Sequence Container(序列式)
Arrary (数组) 固定大小 12
Vector (向量) 末尾扩充 12
heap 以算法形式呈 ...
C++11新标准
variadic template
就是参数个数随意的模板,定义任意个参数的模板,可以是任意类型
而且可以依据参数重载,关键字 typename… 也可以实现递归,下面的这两种给方式可以并存
相较来看,第一个定义比较特化,第二个比较泛化,所以就会,如果传入参数是 1 + x 那么就调用第一个,否则调用第二个
12345template <typename... types>void func(size_t seed, types& ...args){return func(args...);}template <typename... types>void func(types& ...args){}
Space in Template Expressionn**ullptr & std::nullptr_t
左边是一个 object,就是0的空的指针,允许使用 null 代替0
auto
auto 表示不知道是什么类型的变量,可以把任意变量赋予 auto 变量
编译过程中,编译器会自动识别类型, ...
unity游戏开发-MYSQL
MySQL配置
先安装一个数据库,我使用的是 8.0.35 版本的,版本没什么大的要求。也可以安装一个可视的 UI 界面,例如 workbench,方便做一些操作
在数据库中添加表格,然后将某一个 user 的 localhost 设置为 %,就可以实现其他设备的登录了
unity端配置
在 Assets 文件目录下新建一个文件夹 Plugins 用来存放数据库需要的一些文件 (必须是这个名称,不能更改,不然 unity 不能识别出来)
可以不用下载 MySQL Connnector/NET,直接在 vs中安装 mysql 包 项目→管理 NuGet 程序包,直接在浏览中搜索 MySQL,安装第一个,之后它会自己把依赖装好
然后,最最重要的一步,在vs的解决方案资源管理器的项目的引用之下,找到 mysql.Data 这个项目,查看它所在的路径,在文件资源管理器中找到它,把它拖到第一步所建好的文件夹中,然后进入unity它会报错,查看错误信息,是需要一些文件,然后再在项目引用之下找到 Google.Protobuf , K4os.Compression.LZ4 , K4os.Com ...
request-python学习记录
requests 学习
静态网络与动态网络
动态xml页面: 如果网络界面是由js加载上去的,那么网络就是动态的
静态xml页面: 没有使用js加载
通用爬虫: 通常指搜索引擎的爬虫 面向互联网上所有的网站
聚焦爬虫: 针对特定网站的爬虫 针对几个网站,特定的网站
步骤
url list
响应内容 提取url
提取数据
入库
DNS服务器: 根据客户给定的域名,来返回对应的 ip 地址,客户通过 ip 地址请求页面,返回页面的 html+js+css+.jpg
url形式:
scheme://host[:port# ]/path/…/[?query-string ][#anchor ]
scheme: 协议(http,https,ftp)
host: 服务器的ip地址或者域名
port: 服务器的端口(如果是默认端口就是 80 / 443)
path: 访问资源的路径
query-string: 参数,发送给http服务器的数据
anchor: 锚点(跳转到网页的指定冒点位置)
url地址带上锚点与不带锚点是一样的
HTTP
http
超文本传输协议
默认端口号: 80
...
stm32-ucos使用
计算机操作系统
计算机只由硬件构成的叫做“裸机“,不能工作,必须有软件
多任务
把一个大任务分解为几个小任务,那在一个任务需要等待I/O时就可以交出CPU的使用权去运行其他的任务,可以极大的提高CPU的利用效率。
内核类型
可剥夺型内核
总是运行优先级别最高的任务,即使CPU正在运行某一个低优先级的任务,当高优先级的任务准备就绪时,就会剥夺低优先级的任务的CPU的使用权。
不可剥夺型内核
总是优先级别高的任务最先获得CPU的使用权,要求每个任务都能主动放弃CPU的使用权。
任务切换时间
多任务系统的任务之间的切换是需要时间的。操作系统的任务调度器就是做这项工作的。调度器在进行任务切换时需要一段时间,这段时间的长短也影响系统实时性,任务调度器进行任务切换所用的时间不能受到应用程序中其他因素(任务数目等)的影响。
终端延时
外部事件的发生会以中断申请信号的形式通知CPU,然后才运行中断服务程序来处理该事件,自CPU响应中断到CPU转向中断服务程序之间所用的时间叫做终端延时,也影响系统的实时性。
ucosii使用
用户应用程序的结构
123456789v ...
opencv
图像色彩转换
图片转灰度图
这个操作可以在一开始读取照片时就完成,也可以自己根据每个像素点,把每个像素点的r,b,g三个参数调成一样的,也就能形成灰度图
12def imread(filename: str, flags: int = ...)
这里的flags能选择读入图片的形式:0是灰度图,1是彩色图
123456789101112for i in range(img.shape[0]): for j in range(img.shape[1]): point = [i,j] (b,g,r) = img[i,j] b = int(b) g = int(g) r = int(r) # gray = 255 gray = (b + g + r)/3 # 第一种灰度化方法 # gray = r*0.299 + g*0.587 + b*0.114 # 第二种灰度化方法 img[i,j] = np.array([gray,gray,gray],dtype ...
编译原理
编译器的结构介绍
1234graph LRA[高级语言]-->|编译|B[汇编语言]A-->|编译|C[机器语言]B-->|汇编|C
编译流程
123graph TDA(源程序)-->B[预处理器]-->|将存储在不同文件中的源程序聚合在一起,宏展开|C(处理后的源程序)-->D[编译器]-->E(汇编语言)-->F[汇编器]-->G(可重定位目标文件)-->H[链接器&加载器]-->|修改可重定位目标文件,将修改后的指令和数据放入内存中|I(可执行目标文件)J(库文件)-->H
编译器结构
12graph TDA(字符流)-->B[词法分析器]-->C(词法单元流)-->D[语法分析器]-->E(语法树)-->F[语义分析器]-->G(语法树)-->H[中间代码生成器&机器无关代码优化器]-->I(中间表示形式)-->J[目标代码生成器]-->K(目标机器语言)-->L[机器相关代码优化器]-->M(目标机器代码)
其中机器无 ...
设计模式
GitHub - Luo25177/Design-Pattern
介绍
设计原则
依赖倒置原则
高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定),稳定的东西不应该依赖于变化的东西
抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定),稳定的东西不应该依赖于变化的东西
解决: 创建抽象类,之后的类依赖抽象类
依赖:例如A依赖B,在编译A的时候只有B存在才能编译成功 编译式依赖
开放封闭原则
对扩展开放,对更改关闭
类模块应该是可以扩展的,但是不可以修改
单一职责原则
一个类应该仅有一个引起它变化的原因,一个类不能放太多功能,也就是不能有太多的责任
变化的方向隐含着类的责任
Liskov替换原则
子类必须能够替换它们的基类(is-a)
继承表达类型抽象
接口隔离原则
不应该强迫客户程序依赖他们不用的方法
接口应该小而完备
真正有必要暴漏出去的方法才做成 public
优先使用对象组合而不是类继承
类继承通常为"白箱复用",对象组合通常为"黑箱复用"
继承在某种程度上破坏了 ...
操作系统
前言
这个笔记是跟着 jyy 老师学的,有兴趣的话可以看看原视频,讲的很不错
读手册,读手册,读手册
http://jyywiki.cn/pages/OS/2022/demos/
绪论
操作系统是服务于程序的,程序就是状态机,计算机每执行一条指令计算机的内存和寄存器都会发生变化
操作系统=对象(文件,进程,管道)+API(操纵对象的API)
用简单的硬件实现对象和API,操作系统可以用c程序实现
广义的操作系统:基于下层的支撑为上层提供服务
程序
程序就是状态机,作为一个状态机是没有办法自己销毁自己的,只能以死循环或者以一个系统调用(告诉操作系统该销毁了)结束,程序的状态机模型
状态 = 堆 + 栈
初始状态 = main 的第一条语句
迁移 = 执行第一条语句
任何 C 程序都可以改写成非复合语句的 C 代码,所有程序都是运行在计算机上的,计算机就相当于是状态机,C程序的所有代码都会被推入栈中,之后在运行过程中依次调用,每执行一条指令计算机的状态也会发生改变,指令是从pc取出来的,确定性的指令,状态是一条直线
系统调用 syscall
这个指令就是把系统完全交给操作系统,任其 ...
ubuntu指令
ubuntu关于安装的指令
bus restart重置输入法
sudo apt search package 搜索包
sudo apt show package 获取包的相关信息,如说明、大小、版本等
sudo apt depends package 了解使用依赖
sudo apt rdepends package 查看该包被哪些包依赖
sudo apt-cache pkgnames 执行pkgnames子命令列出当前所有可用的软件包
sudo apt policy package 使用policy命令显示软件包的安装状态和版本信息。
sudo apt install package 安装包
sudo apt install package=version 安装指定版本的包
sudo apt install package --reinstall 重新安装包
sudo apt -f install 修复安装 -f = --fix-missing
sudo apt remove package 删除包
sudo apt purge package 删除包,包括删除配置文件等
sudo a ...
zsh使用
安装
在 linux 终端命令行只需要一行指令安装
1sudo apt install zsh
设置为默认终端
在linux终端输入指令
1chsh -s $(which fish)
有时候不是很好用,需要在终端的 preference 中的 command 中设置进入终端的指令即 zsh
配置 oh my zsh
使用 zsh 可以安装一个 oh-my-zsh 用于 zsh 的一些配置和美化,下面两条指令都是安装 oh-my-zsh 的,任选一条安装即可,本质上都是运行 install.sh 文件来进行安装
12345# curlsh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"# wgetsh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
zsh 主题
这个主题可以从网 ...
vim使用
前言
作为一个历史上最出色的编辑器,拥有自定义按键功能,并且可以大大提高工作效率
在linux中的安装
在linux中只需要一行指令安装
1sudo apt install vim
linux 上的配置文件
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150" etc/vim/vimrc" the call to :runtime you ca ...
fish使用
fish安装
可以使用指令安装 fish
1sudo apt install fish
将fish设置为默认终端
只需要终端的一行指令
1chsh -s $(which fish)
fish 个性化配置
fish的配置基本上是通过一条指令来的
fish --config 之后会打开一个网页,然后在其中可以自己选择好看的主题之类的
tmux使用
tmux安装
在 linux 命令行终端只需要一行指令就可以
1sudo apt install tmux
tmux 使用指令 针对于同一个窗口不同的分割操作
竖直分割窗口 crtl-b "
水平分割窗口 crtl-b %
关闭窗口 crtl-b &
切换窗口 crtl-b 上下左右按键,或者 ;
tmux 窗口指令,针对于对不同的窗口操作
& 关闭当前窗口
l 前后窗口间互相切换
. 修改当前窗口编号,相当于重新排序
f 在所有窗口中查找关键词
, 重命名当前窗口
w 列出所有窗口
% 水平分割窗口
" 竖直分割窗口
n 选择下一个窗口
p 选择上一个窗口
0~9 选择 0~9 对应的窗口
空格 更改竖直与水平的窗格
x根据提示关闭 关闭当前窗格 或者直接 crtl-D 关闭
z 当前窗口全屏显示
tmux的分割窗口实现实际上是多个终端,并且可以通过echo对终端的文件进行操作,然后会出现在对应终端上 /dev/pts/n
配置文件
1234567891011121314151617181920212223242526272829303132333 ...
gdb使用
前言
gdb 功能
动态改变程序的执行环境。
自定义启动运行需要调试的程序。
在指定位置使用条件表达式设置断点。
在程序暂停时观察代码内变量值的变化。
开始前准备
主要是生成调试信息,在编译的时候,添加 -g 选项来生成调试信息,以此来使用 gdb 的调试
gdb 外部指令
gdb 可执行文件名 启动 gdb 调试
gdb --help 查看指令帮助
man gdb 查看 gdb 手册
gdb -x xxx 在 gdb 启动时运行一些脚本
gdb --version 查看 gdb 版本
gdb 内部指令
开始运行
r/run 开始运行,会一直运行,直到断点
start 开始运行,在 main 处会停下来
starti 开始运行,在第一条指令处停下来
r/run param 开始运行,会一直运行,直到断点,后面的 param 就是可执行文件后面需要跟的参数
运行中指令
c/continue 继续运行,一直运行,直到下一个断点
c/continue n 继续运行,一直运行,会忽略 n 个断点
s/step 单步,不进入函数内部
si/stepi 单步进入,进入函数内部,是在机 ...
gcc使用
前言
介绍
GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。
GCC 原名为 GNU C语言编译器,因为它原本只能处理 C 语言,但如今的 GCC ,不仅可以编译 C、C++ 和 Objective-C,还可以通过不同的前端模块支持各种语言,包括 Java、Fortran、Ada、Pascal、Go 和 D 语言等等。
GCC支持多种硬件开发平台,还能进行跨平台交叉编译。此外,GCC是按模块化设计的,可以加入新语言和新CPU架构的支持。
GCC、gcc、g++三者之间的关系
gcc(GUN C Compiler)是GCC中的c编译器,而g++(GUN C++ Compiler)是GCC中的c++编译器。
gcc和g++两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按c ...












