自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++学习笔记(面向对象部分开始6500字复习总结)

读取一个类型的虚函数表需要将类的类型转换为指针类型,此处感悟,程序中数据的运算形式(即运算符的操作形式)是由该变量的类型决定,int也可以看做一个变量,它是定义int类的那一块空间的地址,将int转换为void *,就可以访问int类定义的地址了,类比自定义的类结构,访问类定义的地址后,前8个字节就是虚函数表的首地址,再对首地址进行遍历函数接口,就可以输出所有的函数了。《个人理解》当需要调用拷贝构造时,就一直往前传递this地址指针,省掉中间的拷贝构造,直接让对应接口的构造函数在目标对象的地址上进行构造。

2022-11-21 02:17:09 439

原创 C++右值引用是一个左值引发的思考

提出问题:在进行vector的封装时,突然疑惑,为什么右值引用的形参,却是一个左值,而且还要把再次它转换成右值才能作为右值使用,此前写移动构造也使用右值引用,但没有对右值引用调用move()函数的操作,对右值引用调用move()函数变为右值,这听起来就很奇怪。1.将右值直接转换为左值,在C++里,通常产生了右值以后,必须将右值拷贝到一个左值才能保存,但这个拷贝如果是面对大型容器多次拷贝,会产生大量的资源损耗,而直接将右值转换为左值,则节省这些损耗,此时,将右值转换为左值的操作成为移动构造。

2022-11-17 23:23:38 964 1

转载 C++new申请指定地址的空间

http://t.csdn.cn/Zz6KE

2022-11-17 21:58:06 478

原创 new与malloc的区别

另外:动态申请内存时,返回的指针存在栈段中,申请连续内存时,栈段中保存的只是堆段中申请的空间的地址表,在heap中申请一个a,然后把a的地址返回到栈段中保存在一个指针变量里。

2022-11-12 22:01:38 96

原创 c++转换构造与隐式转换

非内置类型隐式转换时,也会遵守c++隐式转换规则,小空间转大空间,隐式构造一个对象用于存放需要转换的对象,这个对象叫做匿名对象,此时会调用对应接口的构造函数,比如要接住一个整型,就会调用整型的转换构造函数。隐式转换成匿名对象后,要把该对象赋给目标对象,此时只能调用重载的赋值运算符,因为默认的赋值运算符只能被内置类型使用。c++寻找参数使用就近原则,作用域内从内向外找。c++隐式转换,小空间转大空间,数据不丢失。转换构造,利用构造函数进行类型的转换。可联想内置类型的设计。

2022-11-12 01:16:54 369

原创 常量引用的意义,对常量引用进行修改

其实,常量引用在绑定时,绑定的并不是对象本身,而是一个临时量/右值/临时空间,然后这块临时空间进行强制类型转换成常量引用的类型,再与其绑定,这么一看,好像也没有打破引用的规范,因为类型依然是一致的,只是像很多c++语法一样,有一些我们看不到的隐性操作。c++ primer 对常量引用的讲解非常好,首先常量引用本身只是一个简称,因为引用并不是一个变量,所以根本不存在常量的引用,而只是对const的引用,当然,如果熟知就好。可以保存一个禁止任何人修改,代码层面又和预编译一样方便修改,常量引用真的不能被修改?

2022-11-05 13:16:20 491

原创 构造与析构(伪构造的意义)

先构造后析构:因为先构造的对象会被后构造的对象所使用,如果将先构造的对象析构,再析构使用了先构造对象的对象时,会访问错误,人话讲就是,你构造的时候用了我当工具,如果先把我这个工具拆了,拆你的时候就找不到我这个工具了,不过这个是C++自己会遵守的条款,此处帮助理解。伪构造:在工程应用中,申请大片空间最好不要在构造函数中进行,因为如果申请空间出错,异常捕捉无法捕捉到构造函数中的异常,所以申请大量空间的任务应该在类里另外单独写出,称为“伪构造函数”。构造函数传参使用初值列,构造顺序只取决于内部成员的构造顺序。

2022-11-05 12:24:47 182

原创 C++条款笔记

c到c++

2022-11-03 10:44:27 57

原创 从汇编看语法糖(C++引用)和指针的区别

c++引用

2022-11-03 10:42:32 272

原创 服务器随记

1.文件描述符是有限制的,默认1024,可以用ulimit修改,所以记得关闭不用的描述符2.TCP连接时,系统内核其实会维护两个队列,一个是半连接,一个是全连接,三次握手还没全部完成的就是半连接,dddd...

2022-01-19 15:16:45 87

转载 .h与.lib与.dll

.h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分 - 我是张洪铭我是熊博士 - 博客园因为自己也没有彻底懂底层原理,等彻底懂了再在这儿更新

2022-01-05 23:51:44 147

原创 web服务器

http协议无响应:一发一收就断开连接无状态:没有状态交流,不会保存上一次连接的状态信息之类的无连接:每次都要建立TCP连接,但是只处理一个请求,处理结束直接断开性能分析:epoll采用监听连接然后进行处理,但是当连接量过于巨大,epoll红黑树也无法继续保持高效,这个时候就必须牺牲一部分性能来换取更多的连接量,每次依然只处理一个请求,不过连接也会断开,保持连接时的稳定性的同时又不保持连接请求各种文件中可执行文件比较特殊,需要另开子进程来处理可执行文件然后再将结果输入到html文件中,结

2022-01-04 20:46:57 1447 1

原创 TCP服务器的逐级进阶

1.多进程服务器父进程:监听端口,创建子进程,无阻塞收尸子进程:保持连接并处理数据注意:多次循环会不断产生新的套接字,然而父进程不用管理连接,子进程不用管理监听,需将无需管理的套接字关闭性能:进程复制耗费资源大2.多线程服务器总进程:监听端口,创建线程子进程:保持连接,处理数据,设置pthread_detach()当线程结束时会自动释放资源注意:线程没有类似于进程的无阻塞随机收尸的func,只有tryjoin无阻塞但也不能随机收尸,但detach可以让线程自己给自己收

2022-01-04 20:24:46 1109

原创 UDP服务器与客户端

联网收发数据方面,简于tcp服务器只需要绑定端口然后阻塞接收就好了,只管接收送上门来的东西,然后发回去就结束一轮客户端更是只需要发就好了和收就结束一轮一方断开重连依然可以和另一方进行收发数据,并不需要像tcp一样要先建立连接,直接发就完事儿了只是简单的完成 收到/发出a的数据然后处理并发还/接收给a 这一功能其他方面的考虑就需要从程序面上另外设计.........

2022-01-04 18:38:00 1109

原创 TCP服务器简陋模板

前言:很久以前就搭过服务器,当时一旦遇到问题根本就无法解决,全都是原理级才能解释,当时也是非常令人难受,解决了问题以后也不知道为什么,不过现在学习了整个底层原理后,以前遇到的问题全都迎刃而解了1.监听端口 创建套接字:套接字选交互方和模式 绑定端口和IP:根据交互方填充结构体,最好先初始化,传端口号和IP地址时注意转字节序,因为结构体不同所以还要传size,防止越界 监听:队列长度根据需要设2.联网 阻塞等待...建立连接(进行...

2021-12-14 16:39:49 2039

原创 (笔记demo)TCP协议部分原理

1.UDP协议 特点: 1.不管理拥堵 2.无序 3.不管理流量速度 4.单向发送,非连接 常用:内网广播:单方面发送,不需要建立连接,流量小,对丢包不敏感 游戏,直播:只需要即时消息,不需要完整时间段2.客户端和服务器 客户端作为发送端没有固定端口,而是类似端口池使用再释放,接收数据时也是随机端口接收 服务器必须绑定端...

2021-12-12 21:50:21 1724

原创 OSI七层模型 TCP/IP五层模型

挖坑

2021-12-12 20:57:42 1872

原创 (笔记demo)网络基础 随记

1.网络就是一块联络全球的数据流通地带,数据之间流通依靠路由器(粗略)2.路由器:就像现实中包裹的中转站 会通过算法将数据包发往正确的下一站3.数据包:IP就是地址,MAC就是收货人的身份证4.转发网关:内网间数据传输时,网关依赖算法找到正确的发送路径5.NAT网关:因为不同局域网内主机的IP不唯一,但网关的IP唯一,所以当数据包需要通过网关离开局域网时,NAT网关会将IP改为网关IP,同理,目的地网关会使用端口映射目的地IPNAT网关类似于一个代理,访问公网时必须要保证

2021-12-11 21:39:25 196

原创 一个数据包的旅行

挖坑

2021-12-11 21:12:08 339

原创 原子操作,pv操作---记录

sig_suspend(传入临时信号屏蔽字用于解除屏蔽);//将解除屏蔽和挂起进程合成为一个原子操作,具体看系统编程信号笔记++i;i++不是原子操作,因为它还临时存储了一个右值;thread_mutex;互斥锁(同类还有信号量),有线程锁时,读-改-写 会合成为一个原子操作,借此避免多线程访问内存冲突的情况,具体看系统编程线程笔记...

2021-12-10 15:32:26 567

原创 (笔记demo)Linux系统编程 线程部分笔记

1. 线程是程序的最小运行单元,代码段只是数据2. 和进程类似,线程也存在资源竞争,在不做管控的情况下,你并不会知道哪一个线程先运行3. 线程没有主次之分,但是进程结束,线程也就结束,所以进程的那条线程可以认为是‘主’线程4. 每条线程都拥有自己的寄存器和栈段,所以当线程结束后,线程内的数据也会被释放5. 线程之间的通信:句柄思想、共享空间、返回值、传出参数、全局变量等等线程管控↓线程管控↓线程管控↓6. 锁:线程中最重要的概念之一,管理线程多...

2021-12-08 18:06:33 842

原创 拓展(终端,回显,前后台,键屏监控

关键概念: 1.系统只有一个前台,其余均为后台 2.只有前台会监控键盘和屏幕 3.Linux中,后台如果执行调用前台操作,会触发SIGTTOU信号 4.终端就是一个shell程序,后续所有程序都是shell的复制,复制会继承dev/tty里shell默认打开的012三个标准 5.网络连接每次会分配一个虚拟的键盘和屏幕用于前台监控...

2021-12-04 19:03:04 714

原创 strtok

char *token, *tokens[LEN];token = strtok("str", "delim");tokens[0] = token;int i = 0;while (token = strtok(NULL, "delim")) { tokens[++i] = token; } 常用切割套路↑...

2021-12-04 17:22:42 413

原创 (笔记demo)Linux系统编程 信号部分笔记

1.信号是什么? 可以直接通过内核对进程进行操作的手段,信号被记录在PCB(进程控制块)里,当进程被杀死后,PCB也就是留下的尸体,包含了该进程的死亡信息 流程:触发发送信号操作 由用户空间转为系统内核操作,对进程PCB施加信号回到用户空间前会逐一检查各PCB中的信号2.信号种类 常规与实时,区别在后续有写,比如5, TER...

2021-11-30 20:41:04 619

原创 深度搜索中的迭代与递归

深度搜索常常用来判断连通性,是因为这一思想的回溯性回溯性的本质就是循环遍历作为横向搜索,递归作为纵向搜索,回溯就体现在‘归’在深度搜索中,递归不仅要设置递归结束点(纵向搜索结束,开始回溯)也要设置整个搜索的结束点(成功搜索到目标),用以结束整个搜索以经典迷宫举例递归结束点就是无法继续前进,也就是前后左右都被堵上,以当前坐标为基础,上下左右循环结束,回溯到前一个点,进行上下左右的循环搜索结束点就是当搜索到目标时,返回1,每次回溯返回值都进行判断是否为1,如果是就一直回溯出递归

2021-11-25 15:21:44 298

原创 (笔记demo)Linux系统编程 进程部分笔记

1.fork创建子进程时,先复制一份父进程,大部分数据都会被复制,但父进程会返回子进程的id,子进程返回0,以此区分以umask举例,umask就是直接父进程后,直接输出自己的umask,如果创建一个0777权限的文件,因为要首先从父进程复制一份,然后0022会和0777进行一些处理(掩码,或非操作?)2.情况分析:父进程给子进程收尸 父进程死亡,子进程由孤儿院(初始进程,pid为1)收尸 产生子进程以后bash就会进入睡眠,等待子进程结束...

2021-11-18 21:12:27 841

原创 关于C字符串

C字符串被存储在.rodata段中,ro意为read only,只读权限,所以直接对字符串进行操作是不合理的。可以将字符串理解为一个常量地址,可以通过下标直接对字符串内部的字符进行访问,如果要对字符串内容调用修改,可以先将其存入一个缓存区,例如:一个函数内的局部字符数组main函数内部↓char *str= "hello world";//该语句意为将一个常量地址赋给一个局部字符数组的首地址;...

2021-11-16 21:41:03 117

原创 项目流程图

2021-11-16 13:01:07 201

原创 (笔记demo)Linux系统编程 文件IO部分笔记

1.直接对系统进行操作通常是很慢的,比如c语言标准库的IO部分在内存里开辟了新的缓存区用于减少系统read(),write()的调用,提高了效率2.open(),write(),read(),以及其他的函数等等,,,都是直接对系统进行操作,有两种常用接口 1.文件结构体,文件描述符fd 2.文件路径3.主函数参数 int *argc,int **argv 常用4.分配的文件描述符是最小的,标准输入输出错误占据了012,所以最小为3...

2021-11-14 21:17:45 1317

原创 关于栈和队列固定结构的标记思想

因为栈和队列都是只能从端口操作数据的结构,并不能直接对中间段数据进行操作,所以具有某种固定的数据连续性,例如:栈内数据分别为 2, 3, 4, 7, 5,那么2,3,4可以看做一段数据,因为后续的7, 5 和它并没有联系,那么在这种固定连续数据结构中寻找特殊数据时,就可以对每段进行标记,例如:输出栈内最大数据,2,3, 4最大数据为4, 但2,3, 4, 7, 5最大数据为7,所以最后标记栈内最大元素为 2, 3, 4, 7, 7核心思想:这种连续结构的访问范围是,当前数据及以下,优先弹出栈顶,所以当.

2021-10-29 12:41:43 67

原创 STL的简单了解

STL并非全是标准库,比如string,但也约定俗成为标准库六大部件:算法 容器 适配器 迭代器 仿函数 分配器string :字符串, 可与字符串直接相加进行拼接,查找(find), 插入(insert),截取(substr),替换(replace)vector :动态数组,扩容大小取决于编译器stack :栈,基于双端队列的适配器,压入弹出判空栈顶queue:队列,基于双端队列的适配器,压入弹出头尾判空deque:双端队列, 内存空间并非连续,但是所有单位...

2021-10-28 22:09:05 133

原创 遍历思想进阶(标记)

思考一个问题:需要在50位数里面去寻找极少量特殊数据我们可以一个个遍历,设置一堆筛选条件分支,然后优化分支,缩减遍历区间等等操作可是50位数的超大型数据,且不说上述操作的优化难度,光是50位数必须使用大数存储这一难点就可以筛掉大部分方法那么我们可以想想高中时排列组合问题时,经常需要找到特别的数据一种方向是筛除非目标数,另一种就是直接找到目标数可以观察特殊数据本身,然后进行生成或者标记区间思想关键:不从给定区间去寻找,而是根据目标数据特点自行生成...

2021-10-27 12:19:27 185

原创 遍历思想进阶(高斯)

来思考一个问题,1+...+100 = ?遍历:1+2+3+4+5+6.........+100问题复杂度O(n)高智商人类高斯表示我只需要一半复杂度大家熟知的 (100 + 1) * (100 / 2)所以当遇到遍历时,例如 : 二分查找, 双指针, 多数前缀和问题等等 因为遍历问题无处不在,所以高斯思想非常可贵,也可以使我们换一种角度看待问题...

2021-10-27 11:36:28 191

原创 分析一个问题模型(两人过河)

核心问题:往返次数增加,效率反而提高??第一个要点:有两段时间,第一段是 过河时间 第二段是 返回(送手电)时间第二个要点:找到两者时间最短,或者能平衡? 的方法 过河时间:因为过河时间是按最慢的人来计算,那么就无法避免最慢的人一定会被计算进入总时间,那么可以规避的就是次慢的人可以不被计算,所以尽量是 最慢 + 次慢 过河组合 效率最高 返回时间:当然是越快越好,所以优先选择最快的人 冲突:如果要由最快的人往返送手电,那么就会导致过河时间进...

2021-10-11 15:56:26 401

原创 杨氏矩阵-双指针结合二分优化

杨氏矩阵是由两列相同有序数据相加得到,最后形成的矩阵也符合行列皆是有序序列,如要查找一个数,只需要两个序列不断向前交叉遍历,因为数据相同,所以不用担心重复,最后的遍历路线为蛇形当数据不同,但依然有序时,此时的数据关系变为了大于关系,例如下图中终点13大于10和4等等结合二分时在给定范围内缩小范围的思想,起点从最大序列开始,将大于和小于的部分不断排除,如下图,第一次减去15的一列,第二次减去11的一行,第三次减去12的一行,使矩阵不断缩小二分优化:每次缩减的时候都是依次比较,当从小到大遍历

2021-10-08 16:05:26 101

原创 关于二分答案的二次思考与总结

遇到数据时,去观察它的特点,然后就可能会找到一些错误的联系,比如经典的切木头问题,余下的木头如何处理,我自作聪明地将余下木头当做可以一次性减去的多余材料,但其实随着每次切割长度的增大,余下材料也是变化的,这不是一个线性问题,余下材料其实是因变量。然后进一步思考,发现可以从最大切割长度往下递减遍历,每次进行O(n)的计算,来分析此时的算法,是找到尽量靠近答案的点,然后遍历,这就是一种简单优化的查找1.找到离答案尽量近的起点2.进行遍历照着这两条模板二分!!!!1.找到答案的起点和终点(

2021-10-07 16:40:16 70

原创 二分答案思想(利用映射的虚拟数组折半查找)

折半查找只需要比较三个数(l,r,mid)的大小,就可以删除即时的一半空间的数据,如果这些数据全都进行存储,那是一种无谓的消耗,如果可以以一种映射的方式存储数据的顺序,然后需要比较大小的时候再对应计算出数据,就非常的nice!!!比如接下来这道题我们用二分答案的方法,因为我们要进行查找的是...

2021-10-04 22:04:22 69

原创 大数运算

整数加法模拟高精度加法运算 将数据存放在字符串里,然后反向存放到数组中,再对应下标操作进位,反向存放的目的就在于数组往后扩张更方便,往前无法扩张就得移动整个数组附Euler-13代码#include<iostream>#include<cstring>using namespace std;char str1[55], str2[55];int num1[55], num2[55], sum[55];int main(...

2021-10-02 13:36:48 69

转载 递归与循环

递归好处:代码更简洁清晰。一般来说,一个人可能很容易的写出前中后序的二叉树遍历的递归算法,要写出相应的非递归算法就比较考验水平了,恐怕至少一半的人搞不定。所以说递归代码更简洁明了。递归坏处:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。一般尾递归(即最后一句话进行递归)和单向递归(函数中只有一个递归调用地方)都可以用循环来避免递归,更复杂的情况则要引入栈来进行压栈出栈来改造成非递归,这个栈不一定要严格引入栈数据结构,只需要有这样的思路,用数组什么的就

2021-10-01 14:34:08 231

原创 欧拉计划 算法日记

1.相同特性的数据,可以看做等差/等比数列,然后运用求和公式

2021-09-29 12:41:31 146

空空如也

空空如也

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

TA关注的人

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