- 博客(39)
- 收藏
- 关注
原创 浅拷贝、深拷贝、写时拷贝
一、浅拷贝缺点:当一个对象销毁时,内存块会被释放,其他指向的对象销毁时会由于释放一个悬空指针而出错。二、深拷贝缺点:如果只是访问数据,则浪费内存三、写时拷贝在开始的时候都是使用浅拷贝,当要修改该内存块的数据时,再实现针对该内存块的深拷贝具体做法:在开辟内存块时多开辟4字节,存放引用计数,记录指向该内存块的指针的数量,若有对象要销毁时,将指向内存块的引用计数-1,如果等于0 则销毁...
2019-08-01 09:27:59
284
原创 进程、线程、协程
一、进程进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。二、线程线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。三、协程协程(coroutine)是一种比线程更轻量级的并发执行单元,它的切换开销和内存栈的占用大小都比线程要小。只要内存足够,在一个线程中可有上万个或更多的协程。跨平台跨体系架构无需线程上下文切换的开销无需...
2019-06-25 19:33:43
183
原创 迭代器
一、什么是迭代器迭代器是一种检查容器内元素并遍历元素的数据类型。容器提供了begin 和 end 接口,每种容器都定义了自己的迭代器类型二、定义与初始化vector<int> ivec;vector<int>::iterator iter1=ivec.bengin(); //将迭代器iter1初始化为指向ivec容器的第一个元素vector&l...
2019-05-27 18:44:38
181
原创 纯虚函数
拥有纯虚函数的类就是一个抽象类,不能生成对象(1)抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。(2)C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。(3)C++中的纯虚函数也是一种“运行时多态”。简单使用:class Animal{public: Animal(std :: string name) :mname(na...
2019-05-27 17:37:55
431
原创 继承与多态
多态可以理解成“一个接口‘多种形态’”多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定,是动多态。在东多态过程中,会将函数的入口地址放在.rodata段,加载到内存中那么多态的作用是什么呢,封装可以使得代码模块...
2019-05-27 17:09:53
106
原创 继承与派生
一、通过继承,我们可以用原来的数据类型来定义一个新的数据类型,定义的新类型既有原来数据中的成员,也能自己添加新的成员我们一般把原来的数据类型称为基类或者父类,新的数据类型为派生类,或者子类,在本篇博客中Base为基类,Deriver为派生类继承的本质是代码复用如上图所示继承与派生的关系class Base{public: Base(int a = 0) :ma(a){} void ...
2019-05-18 11:05:21
189
原创 单例模式
1、思想:一个类只能生成一个对象,为了确保在类外不能生成新的对象,所以要把构造函数和拷贝构造函数屏蔽起来,外部不能生成对象,所以在内部提供生成唯一对象的接口2、实现(1)这个接口的返回值不能返回类类型,因为会生成临时对象,(2)不能是普通的成员方法,因为普通的成员方法要依赖对象来调动,而这个接口函数就是为了生成对象,因此要摆脱对对象的依赖,因此为静态的成员方法3、代码(1)懒汉模式---...
2019-05-17 21:10:28
140
原创 对象的生存周期
以以下代码为例class CGoods{public: CGoods(char* name, int amount, float price) { std::cout << this << " :CGoods::CGoods(char*,int,float)" << std::endl; mname = new char[strlen(name...
2019-05-17 19:23:12
188
原创 插入类排序
1、思想从第二个元素开始,从后往前扫描,如果比它大,向后移,找到第一个小于或者等于 它的数插在它后面2、代码void InsertSort(int* arr,int len){ int i; int j; int tmp; for(i = 1;i < len; i++) { tmp = arr[i]; for(j = i-1;j >= 0;j--) { ...
2019-05-16 21:22:19
365
原创 C++-----static修饰的成员变量和成员方法
一、static修饰的成员变量 class Test { public: Test(int a,int b):**mb(a),ma(a)** {} void Show() { cout<<"ma:"<...
2019-05-16 19:56:13
888
原创 C++----const修饰的成员对象与成员方法
一、常对象为什么不能调用普通的成员方法class Test{public:Test(int a,int b):mb(a),ma(a){}void Show(){cout<<“ma:”<<ma<<endl;cout<<“mb”<<mb<<endl;}private:int ma;int mb;};...
2019-05-16 19:31:01
725
原创 C++----初始化列表
一、为什么要有初始化列表?有什么作用?class Test{public: Test(int a,int b) { ma = a; mb = b; }private: int ma; int mb;};对于上面的函数,Test类中的构造函数中,是分别用a和b给ma和mb赋值,是一个赋值的过程。但是,在有的情况就下会发生错误,比如...
2019-05-16 18:15:41
145
原创 C++----函数的调用约定
一、C/C++函数的调用约定(默认使用__cdecl)1、__cdecl C标准调用约定2、__stdcall Windows标准调用约定3、__fastcall 快速调用约定4、__thiscall 类成员方法的调用约定约定了:1、符号生成规则 列如 int sum(int,int)(1) ?sum@@YAHHH@Z(2) ?sum@@...
2019-05-14 18:33:23
214
原创 C++----函数堆栈调用
一、函数堆栈调用以以下简单的代码为例,分析函数调用的过程#include<stdio.h>int sum(int a,int b){ int tmp = a+b; return tmp;}int main(){ int a = 10; int b = 20; int rt = 0; rt = sum(a,b); printf("%d\n",rt); ...
2019-05-14 17:49:09
356
原创 I/0复用----epoll
一、使用epoll使用一组函数来实现来完成任务,而不是单个函数(1) int epoll_create(int size); 创建内核事件表内核事件表:在系统内核中创建一个用于记录用户关注的文件描述符上的事件的一个表select : fd_set read; // 用户空间poll :struct pollfd fds[n] //用户空间返回值: 失败返回-1 成功返回内核...
2019-04-22 22:16:16
120
原创 I/O复用----poll
一、使用int poll(struct pollfd *fds,int nfds,int timeout);(1) struct pollfd{int fd; //关注的文件描述符short events; // 关注的是文件描述符上的哪种事件short revents; // 由内核修改的,返回此文件描述符上发生的事件类型(必须是events指定的关注的事件)(2)nfds:...
2019-04-22 21:38:55
183
原创 I/O复用----select
在之前的进程池、线程池中,一个进程或线程同一时刻只能处理一个客户端,也就是说进程或者线程经常阻塞在recv,是对进程或者线程的浪费,因此有了I/O复用一、概念I/O复用:将N个文件描述法统一监视,当其中某些文件描述符上有事件发生,则程序只处理有事件发生的文件描述符有三种:select、poll、epoll(linux独有)二、select头文件:#include<sys/selec...
2019-04-22 20:58:00
174
原创 C++----智能指针
因为C++中没有自主的内存回收机制,new出来的内存一定要使用dalete释放,否则就会造成内存泄露,因此有了智能指针,智能指针的原理就是收到开辟,系统释放智能指针共分为4种,即boost库中的auto_ptr、scoped_ptr、shared_ptr、weak_ptr。一、c++11 auto_ptr-----所有权唯一,即就是只能有一个智能指针指向该内存块,如果有新的智能指针指向此内存...
2019-04-22 19:44:30
220
原创 TCP高性能服务器编程----进程池、线程池
一、概念服务器启动则创建n(固定值,有限值)个子进程或者函数线程,创建的子进程或者函数线程在服务器终止时销毁,如果有客户端链接,则分配一个子进程或者线程为其服务,服务完成之后则继续等待分配下一个客户端二、线程池相比多线程的优势1、创建的进程或者线程是有限的,服务器的系统代价比较小,一般不会达到系统限制的值2、服务器不需要频繁的创建、销毁进程或者线程,只是在服务器启动时创建,结束时销毁3、...
2019-04-22 18:19:03
320
原创 Linux----线程与进程的区别
一、概念进程 是在内存上运行着的程序线程 是轻量级的进程。是进程内部的一条执行序列(一组有序指令),或者说是执行流。一个进程至少有一条线程,就是main函数所代表的执行序列,通过线程库可以创建线程(即函数线程),一个进程中所有的线程是并发执行的。 主线程仅仅代表进程执行的第一条线程。当主线程通过线程库创建出函数线程以后,所有线程就没有任何区别。二、进程与线程的区别a、进程是资源分配的...
2019-04-14 23:45:12
140
原创 TCP高性能服务器编程----多进程与多线程
首先回忆一下在tcp编程中,主要看一下服务器端的代码#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <...
2019-04-14 23:43:35
366
原创 C和C++的区别
区别从以下几个方面来分析1.函数的默认值(1)自右向左依次赋予(2)不能重复赋值(3)一般赋在声明上2.函数重载函数重载的三要素(1)同名(2)参数不同(3)同作用域3.inline函数 编译阶段(1)调用点直接代码展开(2)inline函数和普通函数的区别普通函数有 开栈 清栈的开销inline函数 没有开栈和清栈的开销inline是以代码膨胀为代价 ...
2019-04-07 20:57:13
115
原创 c++类中4个默认的函数
自己没有写这些函数时,系统会自己提供一个,如果自己写,就不会提供一、构造函数1、作用:初始化对象的内存空间2、特点:(1)可以重载重载的三要素:同名、不同参、同作用域(2)不能手动调用原因:对象的生成有两步,一是开辟内存,二是调用构造函数对内存进行初始化。如果手动调用对象将无法生成。二、析构函数1、作用:释放对象所占的其他资源2、特点(1)不可重载(2)可以手动调用(手动...
2019-04-07 20:33:18
1114
原创 2018C语言及数据结构面试题
1、如何判断合法的IP地址,尽可能考虑各种情况 (腾讯面试题)规则有:正确的“192.168.3.44”(1)由数字字符和点号组成(2)第一个数字字符不能是0(3)数字字符和点号的存放(4)每个数字的范围是0~255代码如下:static int CountPoint(const char *str){int count = 0;while(*str != ‘\0’){i...
2019-01-20 20:47:53
2628
原创 中缀表达式与后缀、前缀表达式之间的转换
生活中,我们常用的是中缀表达式,但是对于计算机来说,后缀或者前缀表达式更好理解,因为后缀表达式已经消掉了优先级现在举个列子,将这个中缀表达式 (“3+4*2/(5-4+1)”)转为后缀表达式第一步,根据优先级加括号(3 + ((4 * 2)/(((5-4)+1)))第二步,将运算符挪到括号后面(转前缀表达式就是挪到前面)(3 ((4 2)(((5 4)-1)+)/)+第三步,去掉括号...
2019-01-14 16:23:58
1996
1
原创 Linux的文件类型权限与目录配置
一、目录存储层次二、文件权限Linux最优秀的地方在于多用户多任务,为了保密各个用户的档案数据,所以档案权限管理很重要在Linux中任何档案都有 user 、group、other 三种身份的个别权限...
2019-01-09 16:17:19
206
原创 C++----编译链接原理
编译链接可分为四个阶段1、预编译(生成.i文件)(1).将所有的“#define"删除,并且展开所有的宏定义;(2)处理所有条件预编译指令,比如:“#if","#ifend"(3)处理"#include"预编译指令,将包含的文件插入到该预编译指令的位置,这个过程是** 递归的**,也就是说被包含的文件可能还包含其他文件(4)删除所有的注释(5)添加行号和文件名标识,
2019-01-08 21:42:33
312
原创 数字转n进制的末尾
将一个十进制数转为n进制末尾有几个0呢??例如:用十进制计算30!将结果转为3进制的话,该进制下的结果末尾有几个0?30!=12345678910…27282930;10进制下 要产生0就是产生1016进制下要产生0就是产生16因此n进制下要产生0就是产生n所以 n进制下有几个0就是有几个n在分析上面的题,数字 3 6 9 12 15 ...
2018-11-29 12:19:24
242
原创 C----交换两个变量的值
下面是几个交换两个数字的函数,分析以下程序,看结果是否正确???**一、**error#include <stdio.h>void Swap_err1(int a,int b)//error1{int tmp = a; a = b; b = tmp; printf("%d,%d\n",a,b);}int main()//父函数{int a = 10; int ...
2018-11-29 11:54:50
254
原创 C----指针运算
int a[]={1,2,3,4,5};int *p[]={a,a+1,a+2,a+3};int **q=p;*(p[0]+1)+**(q+2)表达式*(p[0]+1)+(q+2)的值?分析:如图所示:int *p[]是一个指针数组,int *p[]={100,104,108,112,116}*(p[0]+1) ——&gt;p[0]是指针,值为100,加一就是104,再进行解引...
2018-11-29 11:33:53
385
原创 C----位运算
1、C中位运算符有:&、|、^、~<< (标准规定在右边补0)>> ( 正数则左边补0,负数标准没有规定在左边补充 的数字,分为逻辑右移和算术右移,具体由编译器决定,windows平台和gcc采取算术右移即负数补1)2、常见的二进制位的变换操作(1)通过位运算将一个32位二进制数字num逆序思路如下:用M保存逆序后的数字每次都判断最右边(最...
2018-11-26 14:55:12
140
原创 C----内存区域的分类及对各变量
一、内存区域的分类:栈、堆、全局(静态)变量区、代码段栈:局部变量、函数调用,系统自行管理,不大堆、动态内存,需要程序员自行管理,很大全局(静态)变量区:全局变量、静态变量代码段:函数的代码二、变量的总结...
2018-11-17 10:46:49
200
原创 C----递归简单分析
递归定义:自己调用自己递归就是缩小问题规模,也要考虑到边界条件,还有返回段。分析下面程序递归的过程:int Age(int n)//O(n),O(n){ int tmp; if(n == 1) tmp = 10; else tmp = Age(n-1) + 2; return tmp;}递归过程中入栈过程如下:出栈过程如下所示:这样,递归的整个过程就很清晰了...
2018-11-02 19:19:52
221
原创 C----判断两个整数乘积几进制
对于一般的选择题,我们可以先将两个数的个位相乘,用乘积对每个选项取余;看哪个的余数与给出乘积的个位相等,如果多个选项都与之相等,那么就需要再借助一位例如: 假设在n进制下,下面的等式成立,567*456=150216,n的值是()A 9 B 10 C 12 D18因为是n进制数,所以两个数可以写成(5n^ 2+6n+7)(4n^ 2+5n+6)=2...
2018-10-21 21:13:46
408
原创 C----数组越界问题、指针入门
**一、数组的越界问题**阅读下面的程序,你觉得结果会是怎样的呢???int main(){ int i; int arr[10]; for( int i = 0; i&lt;=10; i++) { arr[i] = 0; printf("%d\n",i); } return 0;}运行发现会发生死循环,到底...
2018-10-18 13:28:59
1137
原创 C----浮点数的精度问题
在生活中解决实际问题时,存在误差是在所难免的,当然,浮点类型的数也存在误差,当 遇到float,double和整型数比较大小时,并不仅仅时简单的将两个数放在一起比较了。要考虑到误差。例如 : 求 ax^2+bx+c=0 的实根代码:#include <stdio.h>#include <math.h>#define EPS 0.00000001 ...
2018-10-16 13:38:55
574
原创 C----整数的位数及打印
(1)求一个整数的位数 //计数器例如: 12345思路如下:12345——>1234——>123——>12——>1每次丢弃个位;直到 n 等于0重点: 十进制数,要丢弃个位就是整除10,那么如果要将一个十进制数转为十六进制有多少位???由此发现, 十六 进制数整除16; n 进制数整除 n代码如下: int Count( int ...
2018-10-15 23:33:15
560
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人