- 博客(46)
- 收藏
- 关注
原创 完美解决google关闭历史栏搜索的问题
google 86版本以上很难去关闭搜索栏搜索历史了,每次弹出之前的搜索记录就让人很烦!!!!!!!!!!解决方案1.下载一个86之前的google版本2.建议把以下几个禁用:“Omnibox on-focus suggestions”“Omnibox switch to tab suggestions”“Zero Suggestions in real search box on New Tab Page”。世界终于清净了...
2021-11-10 21:52:25
6415
原创 Redis详解
Redis面试题一丶说一下你在项目中的redis的应用场景1.5大value类型2.基本上就是缓存3.为的是服务无状态,项目中有哪些数据结构,在单机里需要单击锁,在多机里需要分布式锁4.无锁化二丶Set,Zset分别用于哪些场景三丶redis是单线程还是多线程1.无论是什么版本,工作线程就是一个2.6.x以后版本出现了多线程3.使用上来说,没有变化四丶redis存在线程安全的问题么?为什么?单线程串行,redis可以保障内部串行,外界使用的时候要保障,业务上要自行保障顺序五丶遇到过
2021-11-10 18:46:21
1029
1
原创 可靠的UDP
UDP为什么是不可靠的UDP只有一个socket接收缓冲区,没有socket发送缓冲区,即只要有数据就发,不管对方是否可以正确接收。而对方的socket接收缓冲区满了之后,新来的数据报无法进入到socket接收缓冲区,此数据报就会被丢弃,因此UDP不能保证数据能够到达目的地,此外UDP也没有流量控制和重传机制,故UDP的数据传输是不可靠的bind和connect对于UDP的作用是什么和TCP建立连接时采用三次握手不同,UDP中调用connect只是把对端的IP和端口号记录下来,并且UDP可多次调用co
2021-11-10 09:44:40
1000
原创 操作系统八股文合集
什么是操作系统操作系统是管理计算机硬件和软件资源的计算机程序,提供一个计算机用户与计算机硬件系统之间的接口,向上对用户程序提供接口,向下接管硬件资源,操作系统本质上也是一个软件,作为最接近硬件的系统软件,负责处理器管理,存储器管理,设备管理,文件管理和提供用户接口请介绍一下操作系统中的中断中断是指CPU对系统发生的某个事件做出的一种反应,CPU暂停正在执行的程序,保存现场后自动去执行相应的处理程序,处理完该事件后再返回中断处继续执行原来的程序。中断一般三类,一类是由CPU外部引起的,如I/O中断,时钟
2021-11-08 23:25:15
2252
转载 线程池详解
线程池不采用线程池时:创建线程->由该线程执行任务->任务执行完毕后销毁线程。即使需要使用到大量线程,每个线程都要按照这个流程来创建,执行,销毁。虽然创建和销毁线程消耗的时间远小于线程执行的时间,但是对于需要频繁创建大量线程的任务,创建与销毁线程所占用的时间与CPU资源也会有很大的占比为了减少创建与销毁线程所带来的时间消耗和资源消耗,所以采用线程池的策略程序启动后,预先创建一定数量的线程放入空闲队列中,这些线程都是处于阻塞状态,基本不消耗CPU,只占用较小的内存空间接收到任务后,任务
2021-11-05 17:23:28
976
原创 互斥锁,条件锁,读写锁,自旋锁
mutex(互斥量)mutux即互斥量,也就是常说的互斥锁,尽管名称不含lock,但是称之为锁,也是没有太大问题的。mutes无疑是最常见的多线程同步方式,其思想简单粗暴,多线程共享一个互斥量,然后线程之间去竞争。得到锁的线程可以进入临界区执行代码// 声明一个互斥量 pthread_mutex_t mtx;// 初始化 pthread_mutex_init(&mtx, NULL);// 加锁 pthread_mutex_lock(&mtx);// 解锁 pth
2021-11-05 14:07:03
424
原创 读写锁及其实现
适用场景少量写+大量的读注意这个是先是读优先的读写锁的三种状态1.读模式下的加锁2.写模式下的加锁3.不加锁加锁规则写的情况:1.一次只有一个线程可以占用写模式的读写锁2.一个执行流在写的时候,其他执行流既不能写,也不能读,只能陷入阻塞状态3.多个读取线程可以同时占用读模式下的读写锁,在读写锁的内部有一个引用计数器引用计数:标识着有多少以读模式打开的读写锁线程1.每当一个线程以读模式打开读写锁的时候,引用计数器+12.当一个线程释放以读模式打开读写锁的时候,引用计数器-1作用:
2021-11-05 11:20:23
2497
1
原创 类与对象的构造,析构和内存管理
对象的构造过程创建一个对象分为两个步骤1.首先取得对象所需的内存(从线程栈或全局堆)2.然后在内存空间上执行构造函数在构造函数构建对象时,构造函数也分为两个步骤1.执行初始化(通过初始化参数列表)2.执行构造函数的函数体class Derived : public Base{public: Derived(): id(1), name("UnNamed") // 1 { // do something // 2 }private:
2021-11-05 08:59:10
474
原创 友元的作用以及使用场景
作用友元提供了不同类的成员函数之间,类的成员函数与一般函数之间数据共享机制,通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员使用场景1.普通函数定义为友元函数,使普通函数能够访问类的私有成员class A{ friend ostream &operator<<(ostream &_cout, const A &tmp); // 声明为类的友元函数public: A(int tmp) : var(tmp) {
2021-11-04 16:03:45
2575
原创 虚函数详解
虚函数表相关知识点:1.虚函数表存放的内容:类的虚函数的地址2.虚函数表建立的时间:编译阶段,即程序的编译过程中会将虚函数的地址放在虚函数表中3.虚表指针保存的位置:虚表指针存放在对象的内存空间中最前面的位置,这是为了保证正确取到虚函数的偏移量注:虚函数表和类绑定,虚表指针和对象绑定,即类的不同的对象的虚函数表是一样的,但是每个对象都有自己的虚表指针。在编译时,一个类的虚函数表就确定了,这也是为什么它放在了只读数据段中1.编译器将虚函数表的指针放在类的实例对象的内存空间中,该对象调用类的虚函数时,
2021-11-04 14:15:14
9337
2
原创 内存对齐问题
结构体大小与数组不一样的是,结构体大小不是所有成员大小的简单相加,需要考虑系统在存储结构体变量时的地址对齐问题struct stu1{ int i; char c; int j; }用sizeof求该结构体大小,发现值为12,int占4字节,char占1字节,应该是9字节才对,为什么呢先介绍一个相关的概念–偏移量,偏移量指的是结构体变量中成员的地址和结构体变量地址的差,结构体大小等于左后一个成员的偏移量加上最后一个成员的大小,显然,结构体变量中的第一个成员的地址就是结构体变量的首地址,因此
2021-11-02 14:34:50
323
原创 C++指针
## 野指针概念:野指针就是指向一个已删除对象或者未申请访问受限内存区域的指针产生原因:1.指针定义时未被初始化:指针在被定义的时候,如果程序不对其初始化的话,它会随机指向一个区域,因为任意指针数量(除了static修饰的指针)它的默认值都是随机的。2.指针被释放时没有置空:我们在用malloc()开辟空间的时候,要检查返回值是否没空,如果为空,则开辟失败。指针指向的内存空间在用free()和delete释放后,如果程序员没有对其进行置空或者其他赋值操作的话,就会成为一个野指针。3.指针操作超越
2021-11-02 09:53:44
676
原创 C++11新特性
C++11新特性1.auto & decltypeauto:让编译器在编译期就推导出变量的类型,可以通过=右边的类型推导出变量的类型auto a = 10 //10是int类型自动被推导出来decltype:相对于auto用于推导类型变量,而decltype则用于推导表达式类型,这里只用于编译器分析表达式类型,表达式实际不会进行运算const int& i = 1;decltype(i) b = 2; //b是const int&2.nullptrnullptr是
2021-11-01 19:14:25
451
原创 I/O模型与复用
I/O模型在Unix下可用的五种I/O模型是:阻塞式IO,非阻塞式IO,IO复用,信号驱动式IO,异步IO如何区别什么是阻塞非阻塞,异步同步呢?举个栗子:老王有两只水壶,一只不会响的(下文叫水壶),另一只会响的(下文叫响水壶),有一天老王口渴了,要烧水,他做个四个选择选择一:同步阻塞老王用水壶烧水,他搬来小板凳就在水壶旁边等水开,而且期间一直看着水壶,没做其他事选择二:同步非阻塞老王还是用水壶烧水,他搬来小板凳就在水壶旁边等水开,但是期间他可以打游戏,学习,编码,做了很多事情选择三:异步阻塞
2021-11-01 10:14:49
139
原创 inline关键字
作用inline是一个关键字,可以用于定义内联函数,像普通函数一样被调用,但是在调用时并不通过函数的调用机制,而是直接在调用点展开,这项可以大大减少由函数调用带来的开销,从而提高程序的运行效率特征相当于把内联函数里面的内容写在调用内联函数处相当于不用执行进入函数的步骤,直接执行函数体相当于宏,却比宏多了类型检查,真正具有函数特性编译器一般不内联包括循环,递归,switch等复杂操作的内联函数在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当内联函数编译器对inline函数的处理步骤
2021-10-29 17:30:23
1998
1
原创 static关键字
static全局变量和普通全局变量相同点:存储方式:普通全局变量和static全局变量都是静态存储方式不同点:作用域:普通全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,普通全局变量在各个源文件中都是有效的;静态全局变量则是限制了其作用域,在同一源程序的其他源文件中不能使用它,由于静态全局变量的作用域限于一个源文件,只能为该源文件内函数公用,因此可以避免其他源文件中引起错误初始化:1.修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在main函数运行前就分配了空间,
2021-10-29 16:16:45
93
原创 程序编译流程
程序编译流程程序编译流程分为预处理,编译,汇编,链接一丶预处理1.预处理阶段会将所有#define删除,并展开所有的宏定义2.处理所有的条件编译指令,如#if,#ifdef,这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理,预编译程序将根据有关文件,将不必要的代码过滤掉3.处理#include预编译指令,将被包含的文件插入到该预编译指令的位置(递归进行的,被包含的文件可能还包含其他文件)4.删除所有注释5.添加行号和标识,以便于编译器产生调试用的行号信息及用于编译
2021-10-20 07:08:54
1134
原创 TCP详解
TCPTCP的结构如下序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生。给字节编上序号后,就给每一个报文段派一个序号,序列号seq就是这个报文段中的第一个字节的数据编号确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号,序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接受到下一个字节的编号,因此当前报文段最后一个字节的编号+1即为确认号确认ACK:占1位,仅当ACK=1时,确认号字段才
2021-10-14 14:10:07
783
原创 常见设计模式
设计模式1.单例模式单例模式是一种创建型设计模式,保证一个类只有一个实例,并提供一个访问该实例的全局节点适用场景:1.一个全局使用的类频繁创建与销毁,当想要控制实例数目,节省资源的时候2.如果程序中的某个类对于所有客户端只有一个可用的实例,可以使用单例模式3.如果你需要更加严格的控制全局变量,可以使用单例模式优点:在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例,避免对资源的多重占用缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面应该怎样
2021-10-13 16:25:30
98
原创 C++内存
内存一丶内存分配方式C++中内存分为五个区,分别是栈(stack),堆(heap),自由存储区,全局/静态存储区(bss),常量存储区栈:在执行函数时,函数内局部变量的存储单元,函数参数都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器指令集中,效率高,但分配内存容量有限。堆:那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete,如果程序员没有释放掉,程序结束后,操作系统会自动回收(内存泄漏不是系统无法回收那
2021-09-26 16:39:54
745
原创 深入探索C++对象模型读书笔记(二)
第二章:构造函数语义学2.1 必要的默认构造函数(nontrivial default constructor)的四种情况1.带有default constructor的成员对象(member class object)2.带有default constructor的基类(base class)3.带有一个虚函数(virtual function)的类4.带有一个虚基类(virtual base class)的类在合成的default constructor中,只有基类子对象(base clas
2021-09-24 10:18:29
119
原创 深入探索C++对象模型读书笔记(一)
第一章:对象1.C++对象模型在C++中,有两种class data members:static和nonstatic以及三种class member functions:static,nonstatic和virtual已知下面这个class Point声明class Point {public: Point(float xval ); virtual ~Point(); float x() const; static int PointCount();protected: virt
2021-09-22 21:47:27
129
原创 C++完美转发
完美转发一丶万能引用与引用折叠template<typename T>void func(T&& value){}int i = 1;int &&k = i;func(i);func(1);fuuncfunc(k);func中的形参其实是一个万能引用,当实参为左值时,T和func(i) :实参为左值,故此时T将被推断为int&,value则为int&...
2021-09-20 10:27:40
1137
原创 左值与右值
左值与右值一、左值左值表示一个占据内存中可识别位置的一个对象,更进一步地,可以对左值取地址int a = 10;int *p = &a;int **q = &p;a,p,q都是很经典的左值,可以通过标识符a,p,q,取出内存地址中对应的对象int a;// ①a = 4;// ②①如果在函数中执行该语句的话,变量a会在栈帧中开辟一个4字节的内存空间其值未定义。所以a为左值,能够取其地址②赋值语句中左操作数必须是一个左值,赋值操作本质上是对内存进行更新,所以我们必须要找
2021-09-18 14:10:23
5490
5
原创 Template
Template一丶函数模板与类模板函数模板和类模板本质上可以理解成泛型函数和泛型类,但是它们实际上是模板,而不是真正的函数和类,添加template<typename 类型1,typename类型2,…>并替换掉原有硬编码类型的声明即可函数模板:template<typename T>const T& maxOfThree(const T& a, const T& b, const T& c) { const T& maxV
2021-09-18 10:20:30
154
原创 强制类型转换
强制类型转换一、C风格的强制类型转换在C语言中,强制类型转换是通过“(目标类型)变量名”或者“目标类型(变量名)所实现的”,例如(int)3.14或者int(3.14),前者的方式常称之为C风格的类型转换,后者则被称之为函数风格的强制类型转换二、static_caststatic_cast<目标类型>(expression)static即为静态类型转换,在编译时进行类型检查以及类型转换,但没有运行时类型检查来保障安全性,其作用主要有4个1.相关类型间的转换,double->i
2021-09-17 10:43:27
1051
原创 堆,栈和RALL:C++管理资源的方式
堆,栈和RALL:C++管理资源的方式一、堆(heap)1.由程序员动态分配,底层由malloc和free进行管理2.同样的使用new关键字也在堆上分配内存,但并不是每一次new都会调用底层的malloc方法,因为有这内存池的存在3.在函数中如果非必需,不然不要使用堆内存void buzz() {vector<int> *p = new vector<int>(100);...... delete p;}上述代码这么写是有问题的,如果在…函数操作的时候代码抛出
2021-09-15 15:28:15
550
原创 const关键字
const关键字一、作用1.const为修饰符,用于修饰对象或者变量,表示其不可被修改2.定义常量,const时最为直接的使用方式,比如定义PI3.防止变量被修改,在函数声明中指出不可被修改的参数,可防⽌实参(引⽤ or 指针指向的对象)被修改,降低出现 BUG 的概率,函数返回值同理二丶多文件编程中的使用const所修饰的对象默认为当前文件的局部变量,因此如果需要在多个文件中使用定义的const需要显式的声明externextern const double PI = 3.14; //定义
2021-09-15 13:13:22
105
原创 二叉树刷题的常规题型
二叉树在leetcode上,树的默认数据结构是struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};和链表相比也就是多一个指针
2021-09-13 16:40:43
170
原创 链表刷题的常规题型
链表优点:能灵活的分配内存空间,能在O(1)时间内删除或添加元素缺点:查询元素需要O(n)时间适用场景:数据元素个数不确定,经常进行数据的添加或删除在leetcode中默认的链表结构是struct ListNode { int val; ListNode* next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x,
2021-09-09 19:42:03
144
原创 时间复杂度与空间复杂度
时间复杂度与空间复杂度一个程序的优劣主要从时间和空间两个维度去考量一、时间复杂度比较常见的时间复杂度量级有 O(1),O(n),O(n²),O(logN),O(nlogN),2^n
2021-09-08 16:55:02
958
原创 malloc和new区别
1.new/delete是C++关键字,需要编译器支持,malloc/free属于库函数,需要头文件支持2.使用new操作符申请内存分配时,无需指定内存块大小,Malloc需显示指出内存尺寸3.成功时返回对象类型指针, 返回void*通过强转成我们需要的类型4.失败时抛出异常, 返回NULL5.new在分配对象内存时首先会调用operator new来分配一块足够大,原始的,未...
2019-08-31 08:27:19
109
原创 游戏用tcp还是udp
在实时性方面,tcp协议的网络抗性欠佳,对MOBA类或其他实时性要求较高的游戏,一般是不建议使用tcp作为协议载体。事实上,王者荣耀的PVP通信协议也确实是基于udp封装的;同样,最近大家喜闻乐见的《绝地求生》,也是基于udp的。不同类型的游戏因为玩法、竞技程度不一样,采用的同步算法不一样,对网络延迟的要求也不一样。例如,MOBA类游戏多使用帧同步为主要同步算法,竞技性也较高,无论从流畅性,还是...
2019-08-30 07:59:09
10438
转载 死锁
死锁的概念:在2个或多个并发进程中,如果每个进程持有某有资源而又都等待别的进程释放它或他们现在保持的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是2个或多个进程被无限期地阻塞、相互等待的一种状态。死锁产生的原因:系统资源不足,进程推进顺序非法产生死锁的必要条件: 1.互斥条件:一个资源每次只能被一个进程使用 2.不可剥夺条件:进程已获得资源,在未使用完...
2019-08-17 11:14:37
119
转载 进程间IPC通信
IPC方式:7种1.管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在有血缘关系的进程间使用,进程的血缘关系通常是指父子进程关系。2.命名管道(named pipe):也是半双工的通信方式,但是它允许无亲缘关系关系进程间通信。3.信号(signal):是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。4.信号量(semophere):信号量是一个计数器,...
2019-08-16 09:55:29
113
原创 红黑树与AVL树
1、红黑树:红黑树是一种二叉查找树,但在每个节点增加一个存储位表示节点的颜色,可以是红或黑(非红即黑)。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,通常使用红黑树。性质:每个节点非红即黑根节点是黑的;...
2019-08-16 09:06:22
154
原创 TCP和UDP区别
TCP 是面向连接的,UDP 是面向无连接的TCP传输速度慢,传输速度快TCP 是面向字节流的,它能将信息分割成组,并在接收端令其重组。UDP 是基于数据报的,没有分组开销TCP 保证数据正确性,UDP 可能丢包TCP 保证数据顺序,UDP 不保证确认重传,拥塞控制机制https://blog.youkuaiyun.com/zhang6223284/article/details/81414149...
2019-08-16 07:54:21
120
原创 vector和list区别
1、概念:1)Vector连续存储的容器,动态数组,在堆上分配空间底层实现:数组两倍容量增长:vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。性能...
2019-08-15 23:41:53
125
原创 C++面向对象三大特性
1.封装封装是把对象的全部属性和行为结合成一个独立的单位,并尽可能隐蔽对象内部的细节,降低了系统的复杂性,提供了代码的重用性2.继承它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承的目的是为了实现多态3.多态允许将子类类型的指针赋值给父类类型的指针,一个接口,多种实现静态编译时的多态性,编译时的多态性是通过重载来实现的动态运行时的多态性,运行时的多...
2019-08-15 23:15:32
1061
原创 miniftp项目
1.系统框架搭建common.h<头文件定义>sysutil<公有工具定义>int tcp_server(const char *host, unsigned short port);int accept_timeout(int fd, struct sockaddr_in *addr, unsigned int wait_seconds);miniftp<...
2019-08-12 22:29:47
389
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人