- 博客(23)
- 资源 (8)
- 收藏
- 关注
原创 HTTP和HTTPS的区别,有什么优缺点
http和https:http就是超文本传输协议的缩写,用于从网站服务器传输数据到上网者的本地浏览器的协议https就是在http的基础加上了SSL或者其他的加密方式,所以这就是最主要的区别。原因:因为http在传输的时候是以明文的方式传输数据,这样的话在传输过程中如果被截获就能直接读取信息,所以并不安全,因此需要通过某种方式加密。怎样解决http不安全的问题呢?解决方法就是在http的基础上加上了SSL协议SSL,安全套接字协议,他是靠证书来验证服务端的身份,并在本地
2021-01-31 12:05:37 2039 1
原创 六张图带你深刻理解TCP的拥塞避免控制,建议收藏本文
TCP进行拥塞控制的算法有四种:慢开始 拥塞避免 快重传 快恢复首先我们需要知道一个概念就是拥塞窗口cwnd和慢开始门限ssthresh和传输轮次。拥塞窗口即为发送方的发送窗口,每次可以发送的数据量大小。拥塞窗口大小主要取决于网络的拥塞程度。最开始为1. 慢开始门限主要作用是起一个界定作用,当拥塞窗口大于慢开始门限后,就需要停止慢开始算法,大部分都设置为16,具体原因不详。 传输轮次就是一个往返时间RTT(非恒定)。比如如果拥塞窗口是4,那么RTT就是发送4个报文段,并收到这四个报
2021-01-31 01:25:21 8385 10
原创 一篇带你掌握TCP连接管理——四次挥手
我们在了解三次握手之后:https://blog.csdn.net/qq_46423166/article/details/113441873,接下来看四次挥手的问题。TCP时是向连接的协议。运输连接是用来传送TCP报文的。这里我们讨论TCP连接的释放:四次挥手首先看图解:第一次挥手:客户端向服务器端发送连接释放报文段,并停止再发送数据,主动关闭TCP连接 此时首部中的终止控制位FIN=1,(当FIN=1,表明此报文段的发送方数据已经发送完毕,并要求释放运输连接) ...
2021-01-30 23:43:23 1235 2
原创 一篇带你掌握TCP连接管理——三次握手
TCP时是向连接的协议。运输连接是用来传送TCP报文的。这里我们讨论TCP连接的建立:三次握手首先看图解:第一次握手:客户端向服务器端发送请求, 此时首部中的同步位SYN=1,(当SYN=1,表示这是一个请求报文段。对方若同意连接,则在响应的报文段中使用SYN=1和ACK=1) 同时选择一个初始序号seq=x;(表示发送的序列,可以通过这个序号检测传输过程是否丢包)第二次握手:服务器收到请求包文段后,如果同意建立连接,则向客户端发送确认。 上...
2021-01-30 19:40:28 1533 5
原创 C++11新特性:移动构造函数和移动赋值
移动构造函数就是从拷贝构造函数演化而来的。拷贝构造函数又分为浅拷贝和深拷贝:浅拷贝:当类中有指针时,浅拷贝会发生错误 深拷贝:每次都是重新赋值一份,在某些情况下这种方法可能内存消耗较大因此就产生了移动构造函数,将原来对象的东西移动到新的对象上 移动后当对象销毁时不能发生错误 移动后原对象不再指向被移动的资源,这些资源的所有权已经归属新创建的对象 A(A&x){ this->num = new int(*x.num); cout &l...
2021-01-30 11:50:47 7472 4
原创 使用代码了解new/delete与malloc/free的区别与联系
new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配 new返回的是指定对象的指针,而malloc返回的是void*,因此mallic的返回值一般都需要进行类型转化 new不仅会分配一段内存,而且会调用构造函数,malloc不会, new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free不会 new是一个操作符可以重载,malloc是一个库函数 malloc分配的内存不够的时候,可以用realloc扩容。扩容
2021-01-29 16:29:54 1350
原创 深拷贝和浅拷贝问题
在了解了基础的拷贝问题之后:https://blog.csdn.net/qq_46423166/article/details/113382086我们继续探讨当数据在堆上的问题:即对象定义为:int *a; 那么析构的时候自然要加上:delete a;如下:此时如果还是使用默认的拷贝构造函数#include<iostream>using namespace std;class A{public: A(){ a = new int(10); cout <
2021-01-29 14:24:42 326
原创 拷贝构造函数
1,普通对象之间赋值我们知道普通对象的赋值是很简单的,如: int a = 10; int b = a;仅仅只用一个等号就能将对象a的值赋值给b。2,如果是类呢?#include<iostream>using namespace std;class A{public: A(){ cout << "构造函数" << endl; } //A(A &aa){ // cout << "拷贝构造函数" ...
2021-01-29 13:56:45 1126 3
原创 C++内联函数
首先我们看正常函数的定义如下:void xx(){ .....}此时当程序调用这个函数的时候那么首先找到这个函数的位置然后进行运算再将结果返回调用的地方。
2021-01-29 13:23:08 358 2
原创 这段代码你怎么看:*((int*)&a);
*((int*)&a)这段代码应该怎样理解呢?主要是记录下刚写的一篇博客里面的一个问题。首先&a取a地址 然后int*h转化为int型的指针 最后再*解引用当a是一个类的对象时呢,看下面代码:其中第13行和第14行输出的结果一样,但是这两个东西却是不同的东西。我问别人,别人给举的例子:将这个类比作一个村庄,而a就是这个村庄的第一户人,看似两个地址相同,但是一个代表村口一个是你家。下面将两个详细输出: cout << typeid(...
2021-01-26 00:36:53 2058 1
原创 重新学习顶层const和底层const
这个其实和我另一篇博客内容差不多,就是常量指针,指向常量的指针变量类似。顶层const:表示指针本身就是一个常量底层const:表示指针所指的对象是一个常量这个东西其实也没什么难度了,下面引用点书本上的原话:顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型,类,指针等底层const则与指针和引用等复合类型的基本类型部分有关。比较特殊的是,指针类型既可以是顶层const也可以是底层const。上面的话为什么顶层都适用呢?就是因为顶层co
2021-01-26 00:03:02 3309 6
原创 C++头文件重复编译
重复编译即为重复执行了某一个.h文件情况如下:下面是test1.h和test2.h;test2.h中包含了test1.h下面是main.cpp,包含了上面这个.h文件运行的时候,我们直到main.cpp运行时,先运行test1.h,然后运行test2.h,但是test2.h中包含了test1.h。所以就会产生test1.h重复定义。因此就会报错解决方法第一种: 在test1.h代码最前面加上#pragma once 此时当第二次调用test1....
2021-01-09 21:43:14 787
原创 内存泄露查看方法
定义:内存被占用,使用完成后没有释放产生原因:使用malloc或者new操作之后没有相应的free或者delete危害:内存大量损耗后导致程序越来越慢发现内存泄露ps-aux 查看各个进程的内存占用率,如果某个进程占用的内存在一直上升,很有可能发生了内存泄露其他命令free 查看整个系统的内存使用情况...
2021-01-09 19:55:39 865
原创 C++静态多态和动态多态
静态多态和动态多态静态多态静态多态也称为编译时多态,即在编译时决定调用哪个方法; 静态多态一般是指方法重戟; 只要构成了方法重载,就可以认为形成了静态多态的条件; 静态多态与是否发生继承没有必然联系如下所示:void test(int a){ cout << "1" << endl; }void test(int a,int y){ cout << "2" << endl; }void test(int a,int y,int z){
2021-01-08 23:37:18 1530
原创 C++中什么是多态
多态性:不同类的对象对同一消息的不同响应如果此时有cat类,dog类,pig类。三种类里面都有show函数,正常显示三种应该怎样做呢?先将三个类写出来:然后分别定义出对象,然后再调用show函数: cat a; dog b; pig c; a.show(); b.show(); c.show();这种就是普通定义的方式,怎样把三种东西合到一块写出来呢?将三个东西都继承自animal类,然后使用基类和派生类之间类型转换的方式,用派生类转化为...
2021-01-08 22:33:54 375
原创 基类与派生类的类型转换
一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:派生类的对象可以隐含转换为基类对象。 派生类的对象可以初始化基类的引用。 派生类的指针可以隐含转换为基类的指针。通过基类对象名,指针只能使用从基类继承的成员下面的代码中展示了三种情况:类型转换之后,就可以使用基类中的成员;但是基类不能转化为派生类的对象#include<iostream>using namespace std;class A{public: void show
2021-01-08 21:42:25 1418
原创 代码四区
代码的内存主要分为四个区间代码区 全局区 栈区 堆区其中代码区和全局区是运行前的,栈区和堆区是运行后的。即如果exe文件不运行,就没有栈区和堆区。1,代码区即为程序编程exe文件后的代码特点:只有一份 因为程序不可能运行一次,重新把所有代码重新复制一遍,所以代码区只有一份保密性 程序变成exe文件之后,就不呢查看这个exe文件的源代码2,全局区全局变量 static静态变量 常量(需要注意只有全局变量才是全局区)常量需要注意的原因是因...
2021-01-06 23:41:21 1992 3
原创 虚函数表和虚表指针
1,虚函数的含义用virtual声明类的成员函数称之为虚函数2,作用用于实现多态存在继承关系,子类继承父类 子类重写了父类的virtual function 子类以父类的指针或者引用的身份出现3,虚函数的实现原理其中的关键就是两点:虚函数表指针 虚函数表想要理解其中的结构,还是要从内存布局看起下面都是用debug的方式,查看其中的布局大小一定要理解下面的四段代码1,普通类的内存布局代码:因为普通函数并不占内存,所以此时对象a的并不显示内存
2021-01-06 22:50:15 3051
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人