- 博客(104)
- 收藏
- 关注
转载 I/O多路复用select/poll/epoll
前言早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个。因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll。现代操作系统中,线程数已经得到了极大的提升,如NPTL线程软件包可支持数十万的线程。I/O多路复用selectselect 允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或指定时间后返回它。...
2019-09-09 14:08:00
300
转载 一次完整的HTTP请求过程
前言当我们在web浏览器的地址栏中输入:www.baidu.com,具体发生了什么?概述对www.baidu.com这个网址进行DNS域名解析,得到对应的IP地址根据这个IP,找到对应的服务器,发起TCP的三次握手建立TCP连接后发起HTTP请求服务器响应HTTP请求,浏览器得到html代码浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)(先得...
2019-09-09 00:08:00
337
转载 STL 萃取(Traits)机制剖析
模板特化在将萃取机制之前,先要说明模板特化当有两个模板类,一个是通用泛型模板,一个是特殊类型模板,如果创建一个特殊类型的对象,会优先调用特殊的类型模板类,例如:template <typename T> //泛型模板class MyClass{public: MyClass() { cout << "T MyClas...
2019-09-03 00:47:00
410
转载 C++内存管理(new operator/operator new/operator delete/placement new)
new operator我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的比如:string *ps = new string("Memory Management");相当于void *memory = operator new(sizeof(string)); // 得到未经处理的内存,为Str...
2019-09-02 12:33:00
199
转载 C++的多态总结(静态&动态)
什么是多态顾名思义就是同一个事物在不同场景下的多种形态。静态多态我们以前说过的函数重载就是一个简单的静态多态,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,没有的话就会发出警告或者报错。动态多态动态多态:它是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数。基类中必须包含虚函数,并且...
2019-09-02 10:28:00
156
转载 小根堆(Heap)的详细实现
堆的介绍Heap是一种数据结构具有以下的特点:1)完全二叉树2)heap中存储的值是偏序Min-heap: 父节点的值小于或等于子节点的值Max-heap: 父节点的值大于或等于子节点的值堆的存储一般都用数组来表示堆,i结点的父结点下标就为(i–1)/2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。由于堆...
2019-09-02 01:18:00
3309
转载 详解C++11智能指针
前言C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用。C++11智能指针介绍智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为sh...
2019-09-02 00:55:00
739
转载 Linux线程间同步的几种方式
信号量信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量时,也可以完成一个资源的互斥访问。信号量测重于访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访...
2019-09-01 00:57:00
534
转载 进程间通讯IPC的几种方式总结
Linux进程间的通讯Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来...
2019-08-31 23:48:00
351
转载 约瑟夫斯环问题的几种经典解法
经典的约瑟夫斯问题描述:有n个人围成一圈,从1开始顺序排号。从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号?数组循环模拟法const int N = 1000;int person[N]={0};int getJosePhus(int n,int m){ if (n <= 0 || m <= 0) //检查参数...
2019-08-31 23:01:00
1005
转载 POSIX共享内存
前言几种进程间的通信方式:管道,FIFO,消息队列,他们的共同特点就是通过内核来进行通信(假设POSIX消息队列也是在内核中实现的,因为POSIX标准并没有限定它的实现方式)。向管道,FIFO,消息队列写入数据需要把数据从进程复制到内核,从这些IPC读取数据的时候又需要把数据从内核复制到进程。所以这种IPC方式往往需要2次在进程和内核之间进行数据的复制,即进程间的通信必须借助内核来传递...
2019-08-31 14:53:00
212
转载 POSIX消息队列
POSIX消息队列概述消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。消息队列和管道和FIFO有很大的区别,主要有以下两点:一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相反的,进程向其中写消息时,管道和FIFO必需已经打开来读,否则写进程就会阻塞(默认情况下),那么内核会产生SIG...
2019-08-31 11:57:00
492
转载 extern关键字详解
基本理解extern放在变量或者函数之前,表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。extern有两个作用1.当它与"C"一起连用时,如: extern "C" void fun(int a, int b);告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字...
2019-08-30 12:58:00
134
转载 static的使用总结
全局静态变量全局变量前加上关键字static,全局变量就定义成一个全局静态变量.,全局静态变量存储在静态存储区,在整个程序运行期间一直存在。全局静态变量在程序运行之前就存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。局部静态数据在局部变量...
2019-08-30 12:57:00
104
转载 const关键字总结
const关键字被const修饰的变量是不能改变的const修饰变量时,必须在声明变量的同时给出初始化(类中的const成员变量不一样)顶层const与底层const顶层const定义为变量本身是一个常量,因此对一切的内置类型常量而言,所有的const都是顶层const对指针来说,常量指针是顶层const,对于引用则没有顶层const的概念。底层const只在指针和引用上...
2019-08-30 12:57:00
93
转载 C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)
static_cast相当于C语言中的强制转换:(类型)表达式或类型(表达式),用于各种隐式转换非const转const、void*转指针、int和char相互转换用于基类和子类之间的指针和引用转换,非指针直接报错向上转化是安全的,如果向下转能(指针或引用)成功但是不安全,结果未知;dynamic_cast用于动态类型转换。只能用于含有虚函数的类,必须用在多态体系种,用于类层...
2019-08-30 12:55:00
588
转载 const与#define的区别、优点
const与#define的区别编译器处理方式不同define宏是在预处理阶段展开。补充:预处理器根据以#开头的命令,修改原始的程序。比如我们常见的#include <stdio.h>命令告诉处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中。咱们的#define也是,仅仅是单纯的文本替换。const常量是编译运行阶段使用。类型和安全检查不同def...
2019-08-30 12:55:00
167
转载 C++指针和引用及区别
1.变量首先最重要的,variable的定义,当你申明一个变量的时候,计算机会将指定的一块内存空间和变量名进行绑定;这个定义很简单,但其实很抽象,例如:int x = 5; 这是一句最简单的变量赋值语句了, 将5赋值于名字叫做x的内存空间,其本质是将值5赋值到一块内存空间,而这个内存空间名叫做x。变量在内存中的操作其实是需要经过2个步骤的:找出与变量名相对应的内存地址。根据...
2019-08-30 12:54:00
158
转载 多态中的虚析构函数
为什么析构函数要声明成virtual呢?因为,如果delete一个基类的指针时,如果它指向的是一个子类的对象,那么析构函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。如果一个类要被使用成多态的,那么这个virtual是必须的。比如:#include <iostream>using namespace std;class Animal{ cha...
2019-08-30 12:51:00
143
转载 类的成员函数(构造、析构、拷贝构造、赋值、运算符重载)的实现
以String类为例实现其成员函数class String{ //友元函数重载运算符 friend ostream& operator<<(ostream &out,String& str); friend istream& operator>>(istream& in, String& ...
2019-08-30 12:41:00
166
转载 宏定义中的#和##
代码中的family_##who表示以family_为前缀,将who为后缀与前缀连接,合成一个名字参数前面的#使用来取参数的实值,ADD(1,200)运行结果为201转载于:https://www.cnblogs.com/WindSun/p/11405140.html...
2019-08-24 16:38:00
67
转载 TCP的状态转换
TCP的状态转换图手写的状态转换图一、服务端状态变迁:服务端创建套接字之后调用listen函数将套接字有一个未连接的主动套接字转换为被动套接字,指示内核应接受指向该套接字的连接请求,套接字状态由CLOSE转换为LISTEN,等待客户端连接。所以服务端是被动接收连接的,服务端会先收到SYN,收到之后会立马发送一个SYN+ACK(同...
2019-08-24 15:26:00
152
转载 AVL树的详细实现
【原文:https://cloud.tencent.com/developer/article/1155143】AVL树简介AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。一棵AVL树有如下必要条件:...
2019-08-19 21:00:00
246
转载 十大排序算法总结
算法总结详细十大排序算法:https://www.cnblogs.com/WindSun/category/1375215.html图片名词解释:n: 数据规模k: “桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存算法的分类比较和非比较的区别 常见的快速排序、归并排序、堆排序、冒泡...
2019-08-15 22:57:00
125
转载 排序算法 - 桶排序
前言桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到O(n log...
2019-08-15 22:43:00
165
转载 排序算法 - 计数排序
基本思想计数排序是一种线性排序算法,它利用了一个数组,因为数组下标的增长是线性的,所以它就把自己的元素转换成新开辟数组的下标。可是下标都是非负数啊?数组当中的值有正有负啊。做一个简单的转化就行了:找到数组中最小元素,用元素值减去,这样一来,所有元素对应的下标就求出来了。(实际上感觉像是个映射函数?)下图中保存的是待排序数组:[-1,-5,-6,-2,1,2,8,2,1,8]...
2019-08-15 22:31:00
179
转载 排序算法 - 基数排序
基本思想基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。数组下标从0-9,每个数组元素是一个链表比如对一些三位数以内的树排序,先将个位的数值插入对应的下标的链表中,然后再放回原数组,放回的顺序和插入的顺序一致,将链表清空,再将十位的数字插入对应的下标的链表中,依次操作,最终数组中的数据便以完成排序。算法代码 1 //基数排序...
2019-08-15 22:15:00
196
转载 排序算法 - 归并排序
基本思路归并排序的基本思想是:首先将a[0..n-1]看成是n个长度为1的有序表,将相邻的k(k≥2)个有序子表成对归并,得到n/k个长度为k的有序子表;然后再将这些有序子表继续归并,得到n/k2个长度为k2的有序子表,如此反复进行下去,最后得到一个长度为n的有序表。若k=2,即归并在相邻的两个有序子表中进行的,称为二路归并排序。若k>2,即归并操作在相邻的多个有序子表中进...
2019-08-15 22:00:00
449
转载 排序算法 - 选择排序
基本思路先默认未排序区首个元素为最小,然后从后面的元素中挑出最小的元素,与这个元素交换,直至循环完成。算法代码 1 //简单的选择排序 2 void SelectSort(int *arr, int n) 3 { 4 int i, j; 5 int temp; 6 int minIndex; 7 for (i =...
2019-08-15 21:39:00
83
转载 排序算法 - 快速排序
基本思想每趟使表的第1个元素放入适当位置(归位),并且左边的元素小于这个元素,右面的元素大于这个元素,将表一分为二,对子表按递归方式继续这种划分,直至划分的子表长为0或1(递归出口)。快速排序递归树算法代码 1 void QuickSort(int *arr,int left,int right) 2 { 3 int l = left; ...
2019-08-15 21:32:00
96
转载 排序算法 - 希尔排序
基本思路希尔排序也是一种插入排序,又称缩小增量排序,在效率上教其他插入排序有较大的改进。①d=n/2②将排序序列分为d个组,在各组内进行直接插入排序③递减d=d/2,重复② ,直到d=1算法最后一趟对所有数据进行了直接插入排序,所以结果一定是正确的。它的基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对...
2019-08-15 21:20:00
287
转载 排序算法 - 插入排序
直接插入排序基本思路一趟直接插入排序:在有序区中插入R[i]的过程。算法代码 1 //直接插入排序 2 void InsertSort(int *arr, int n) 3 { 4 int i, j; 5 int temp; 6 7 for (i = 1; i < n; i++) 8 {...
2019-08-15 20:58:00
97
转载 排序算法 - 堆排序
【原文:https://www.cnblogs.com/fortunely/p/10254161.html】1.基本概念堆,分为大顶堆(大堆)和小顶堆(小堆),是顺序存储的完全二叉树,并且满足以下特性之一:(1) 任意非终端结点关键字不小于左右子结点(大堆) ki>= k2i+1并且ki>=k2i+2其中,0 <= i ...
2019-08-14 23:46:00
159
转载 Tinyhttp源码分析
简介Tinyhttp是一个轻量型Http Server,使用C语言开发,全部代码只500多行,还包括一个简单Client。Tinyhttp程序的逻辑为:一个无线循环,一个请求,创建一个线程,之后线程函数处理每个请求,然后解析HTTP请求,做一些判断,之后判断文件是否可执行,不可执行,打开文件,输出给客户端(浏览器),可执行就创建管道,父子进程进行通信。父子进程通信,用到了dup2...
2019-08-13 00:45:00
216
转载 C++11 新特性学习
在Linux下编译C++11 #include<typeinfo>int main(){ auto a=10; cout<<typeid(a).name()<<endl; //得到a的类型,只是一个字符串 return 0; }编译需要加-std=c++11,如下例:autoC++11...
2019-08-11 20:46:00
120
转载 C++继承、多态与虚表
继承 继承的一般形式 子类继承父类,是全盘继承,将父类所有的东西都继承给子类,除了父类的生死,就是父类的构造和析构是不能继承的。 继承的访问权限从两方面看: 1.对象:对象只能直接访问类中公有方法和成员。 2.继承的子类 私有继承就终止了父类再往下继承的能力 c++默认继承为私有继承 像以下程序 class D :public B1 ,public B2,public B3公有继...
2019-08-11 17:52:00
166
转载 extern "C" 与函数重载
前言如果向要在一个文件中使用另一个文件中的变量,不能在头文件中定义全局变量,因为被多个文件包含后会导致编译出错,并且静态的static变量,只能在本文件内使用,这时候就可以使用extern关键字。extern 关键字: 首先还是先看一下 extern 关键字的作用:extern关键字可以置于变量或函数前,以标示变量或函数的定义在别的文件中,提示编译器遇到此变量或函数时在其他...
2019-08-11 10:43:00
283
转载 Nginx的相关介绍
前言说到服务器,一定会想到apache的httpd和NginxApache的发展时期很长,而且是毫无争议的世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它出现的时间太长了,它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的。它不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗...
2019-08-09 23:55:00
86
转载 C/C++内存四区
内存模型图32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中。其逻辑地址其划分如下:各个段说明如下:3G用户空间和1G内核空间静态区域:text segment(代码段):包括只读存储区和文本区,其中只读存储区存储字符串常量,文本区存储程序的机器代码。...
2019-08-09 17:58:00
210
转载 解决VS2017中出现:This function or variable may be unsafe
解决办法:项目名称-右键属性-C/C++ - 预处理器 -预处理器定义 - 右侧下拉框中选择“编辑”- 在第一个编辑框中添加_CRT_SECURE_NO_WARNINGS 转载于:https://www.cnblogs.com/WindSun/p/11327182.html...
2019-08-09 14:55:00
371
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人