栈和队列的区别?
栈和队列都是在运算受限制的一种线性表,栈的插入删除操作在其一端进行,其特性先进后出,又称 LIFO 表。而队列是在一段进行插入操作而在另一端进行删除操作,即先进先出,又称 FIFO 表
二者区别可在如下方面:
元素出入顺序
对插入和删除操作的界定
遍历数据的效率,即时间复杂度
TCP 和 UDP 的区别?
1、基于连接与无连接
当客户端和一个服务器通过 TCP发送数据时,必先建立连接,俗称TCP握手。此过程控制消息在客户端和服务器之间进行互换来实现。而UDP则是无连接的协议,比如我门的QQ消息
2、可靠性方面
TCP提供交付保证,确认对方能够收到数据,这便意味着使用TCP协议发送的消息是保证交付给客户端的,如果传输过程中发生丢失,那么它将重发,这是TCP协议自身保证的,
而UDP是不保证消息能够传达给客户端,比如我们给对方发送了一则消息对方收到没收到,我们是不能保证的
- 有序性
TCP除了保证交付,还有一定的有序性,该消息从服务器发出并以同样的顺序发送到客户端,尽管消息在网络的另一端可能时无序的,这就说明TCP协议会为你排序,而UDP没有任何有序性的保证
- 数据边界
TCP不保存数据的边界,而UDP保证。在传输控制协议,数据以字节流的形式发送,并没有明显的标志表明传输信号消息(段)的边界。在UDP中,数据包单独发送的,只有当他们到达时,才会再次集成。包有明确的界限来哪些包已经收到,这意味着在消息发送后,在接收器接口将会有一个读操作,来生成一个完整的消息。虽然TCP也将在收集所有字节之后生成一个完整的消息,但是这些信息在传给传输给接受端之前将储存在TCP缓冲区,以确保更好的使用网络带宽
- 传输速度、报头大小、重量级(开销成本)
由于TCP协议在进行数据传送之前要进行创建连接,并且要提供数据的可靠交付以及序列性的保证,因此TCP协议传输速率较UDP传输协议慢一些。并且TCP要比UDP拥有更大的“头”一个TCP包头大小为20字节;TCP报头中包含ACK号、序列号、数据偏移量、保留、控制位、紧急指针、可选项、填充项、校验位、目的端口与原端口等;而UDP中只包含长度、目的端口、源端口号、校验和
- 拥塞控制与流量窗口
TCP作为面向连接的提供全双工可靠服务协议,具有差错控制、拥塞控制和流量控制等功能。此处所谓的拥塞控制和流量控制,就是将发送端发送能力、接收端接收信息的能力以及当前的网络环境参与考虑,在网络拥塞情况严重或者接收端接收能力有限的情况下,减缓或暂停消息发送,当情况改善时,增强消息发送能力,加上超时/丢失重发的机制,共同提供可靠传输。
进程和线程的区别?
https://blog.csdn.net/qq_41880190/article/details/84674962
数组和链表的区别?
- 组成两种数据结构元素个数
- 存储单元分配方式
- 元素与元素之间的联系
- 对该种数据结构进行增删改查的特性
数组优点:随机访问性、查找速度 链表优点:插入删除效率、内存使用率、大小不固定可动态申请
堆和栈的区别?
栈:是一种运算受限制的线性表,只允许在其一端进行插入与删除操作,此端即位栈顶,特性先进后出
堆:一种完全二叉树,当且仅当所有结点的值总是不大于或者不小于父结点的值,把这种完全二叉树称为堆。有大小堆之分
二者区别可表现在如下方面:
- 申请方式
栈:系统自动分配
堆:malloc、new
- 申请后系统的反馈
栈:只要申请的空间小于剩余空间就没问题,否则栈溢出
堆:首先我们应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序申请时,会自动遍历该链表,寻找第一块空间大于所申请空间的堆节点。然后将此结点从空闲链表当中删除,并将此结点分配给程序
- 申请大小的限制
栈:Windows下栈是向低地址扩展的数据结构,是一块连续的内存区域。意思就是栈顶地址和栈最大容量是系统预先设定好的,一般是2M,如果超出最大空间将提示overflow
堆:堆是向高地址扩展的数据结构,是不连续的内存区域,堆的大小受限于有效的虚拟内存
- 申请效率
栈:系统自动分配和释放
堆:由new分配内存,容易产生内存碎片,用起来方便,另外Windows下,最好的方式使用VirtualAlloc分配内存,是直接在进程地址空间中保留的一块内存,速度快、灵活
- 存储内容比较
栈:函数调用时,第一个进栈的是函数调用语句的下一条可执行语句的地址,然后是各个参数,大多数编译器下参数由右往左依次入栈,然后是局部变量,静态变量不入栈
堆:其内容有程序员安排,一般在堆的头部存放堆的大小
- 存取效率
栈相较堆块
Set 和 list 的区别?
Get 和 post 的区别?
HTTP1.0 和 HTTP1.1 的区别?
New 和 malloc 的区别?
二者区别表现在以下方面:
- 属性
New 和 delete是C++关键字,而malloc是库函数需要头文件支持
- 参数
New :使用new操作符申请空间分配时,无需显式指定内存块的大小,编译器会根据类型自行计算而malloc则需要人为自行计算,显示的指定所需内存块大小
- 返回类型
New:new成功后返回对象类型的指针,严格与对象匹配,无需进行类型转换,因此new是出于安全性的操作符而malloc成功后返回的是(void*)需要我们进行强制类型转换
- 分配失败
Malloc:分配失败返回NULL,而new:失败后会抛异常bad_alloc
- 自定义类型
自定义类型:new会先调用operator new()函数,申请足够空间(通常底层由malloc实现)然后调用类型构造函数,初始化成员变量,最后返回自定义类型指针,delete先调用析构函数,然后调用operator delete()来进行函数释放(底层通常free实现)
Malloc/free是库函数只能动态申请动态释放,无法强制要求做自定义类型对象构造和析构
- 重载
C++允许new和delete重载,malloc不允许重载
- 内存区域
New操作符从自由存储区上为对象动态分配空间,自由存储区是一个抽象的概念,凡是通过new申请的空间即在自由存储区,而不是堆。Malloc另谈
指针和引用的区别?
都是地址(一个是指向一块内存另一个则是这块内存的别名)
指针是一个实体,需要分配内存空间,引用只是变量的别名,不需要分配内存空间
引用在定义的时候必须初始化,并且不能改变,指针在定义的时候不一定要进行初始化,并且指向的空间可以不变
存在多级指针但是不存在多级引用,引用只有一级
指针和引用的自增不能一概而论,指针 + 1是指向下一个内存空间,引用是引用的变量值 + 1
指针和引用的访问效果不同,间接访问和直接访问,
Sizeof(指针)是指指针的大小,sizeof(引用)是指所指对象的大小
使用指针之前要判空
引用只能在定义是被初始化一次,从一而终不再发生变化,而指针可以见异思迁
五种 IO 模型的区别?
结构和联合的区别?
Struct中成员按顺序依次排列,互相独立,在排列时引入了对齐问题,而union中成员共用一块内存,起始地址都是相同的即union中成员是对同一地址的多个引用,对同一地址的多种表达
对于union不同成员赋值,将会对其进行重写,原来成员的值就会不复存在,而对与struct的不同成员是互不影响的
Vector 和 list 的区别?
- vector是顺序表表示一块连续的内存,底层为动态数组,元素被顺序存储,而list是双向链表在内存中不一定连续
- 当数值内存不够时,vector会重新申请一块内存把原来的数据拷贝到新的内存上,list不用考虑内存的连续因此开销比较小
- List只能通过指针来访问元素,元素的随机性访问效率低下,在频繁进行存取元素是应采用vector较为合适
- 当vector插入删除一个元素时需要移动复制带插入元素后面的所有元素,因此有频繁插入删除操作时list合适
Map[] 和 find 的区别?
仿函数和函数指针的区别?
红黑树和 B 树的区别?
C 和 C++ 的区别?
Vector 和 map 的区别?
宏和普通函数的区别?
Sizeof(数组名) 和 sizeof(&数组名) 的区别?
内联函数和宏?
https://blog.csdn.net/chenguolinblog/article/details/27126589
$1、$2、$@、$#、$?区别?
$#参数个数、$0脚本本身的名字、$1传给脚本的第一个参数、$2传给脚本的第二个参数、$@传给脚本的所有参数、$$脚本运行的进程ID号、$?命令的推出状态,0表示无错误
虚函数和纯虚函数?
常量指针和指针常量的区别?