自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(139)
  • 收藏
  • 关注

转载 lombok的使用

https://blog.csdn.net/ChenXvYuan_001/article/details/84961992

2019-09-22 19:47:06 201

原创 网络基础

网络基础一、模型1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。2.数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据...

2019-09-03 20:02:35 432

原创 java异常完全解析

java try catch 异常后还会继续执行吗?catch 中如果你没有再抛出异常 , 那么catch之后的代码是可以继续执行的 , 但是try中 , 报错的那一行代码之后 一直到try结束为止的这一段代码 , 是不会再执行的...

2019-08-27 19:56:09 233

转载 c中内存对齐

要了解为什么要内存对齐,首先我们要了解什么是内存对齐什么是内存对齐关于什么是内存对齐,我们先来看几个例子typedef struct {int a;double b;short c;}A;typedef struct {int a;short b;double c;}B;分别对他们求大小,sizeof(A),sizeof(B)我们所得到的结果是不同的,sizeof(A)...

2019-08-27 15:15:52 188

转载 如何使用namespace?

一、为什么使用命名空间考虑一种情况,当我们有两个同名的人,Zara,在同一个班里。当我们需要对它们进行区分我们必须使用一些额外的信息和它们的名字,比如这个区域,如果它们生活在不同的区域或者它们的母亲或父亲的名字,等等。在您的C++应用程序中也会出现同样的情况。例如,您可能正在编写一些具有名为xyz()函数的代码,并且还有另一个可用的库,它也具有相同的xyz()函数。现在编译器无法知道您...

2019-08-26 16:28:18 1231

原创 函数模板和类模板

函数模板1.1.1为什么要有函数模板需求:写n个函数,交换char类型、int类型、double类型变量的值。案例:#include <iostream>using namespace std;/*void myswap(int &a, int &b){ int t = a; a = b; b = t;}void ...

2019-08-26 11:24:23 159

原创 C++编译器模板机制剖析

编译器编译原理什么是gcc gcc(GNU C Compiler)编译器的作者是Richard Stallman,也是GNU项目的奠基者。 什么是gcc:gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器(GNU C Compiler),现在已经支持多种语言了,如C、C++、Java、Pascal、Ada、COBOL语言等。...

2019-08-26 10:27:21 212

原创 纯虚函数和抽象类

纯虚函数在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该类的派生类去做(派生类必须要实现)。在基类中实现纯虚函数的方法是在函数原型后加“=0”。声明形式:virtual void fun()=0;虚函数在函数中可以有实现部分纯虚函数的基本用法#include <iostream>using namespace std;////面向抽...

2019-08-22 21:20:57 150

转载 gcc的使用

GCG -o选项用来指定输出文件,它的用法为:[infile] -o [outfile][infile] 表示输入文件(也即要处理的文件),它可以是源文件,也可以是汇编文件或者是目标文件;[outfile] 表示输出文件(也即处理的结果),它可以是预处理文件、目标文件、可执行文件等。[infile] 和 [outfile] 可以是一个文件,也可以是一组文件:如果 [infile] 是一组文...

2019-08-21 11:15:59 95

原创 c++中的继承

1)C++中的继承方式会影响子类的对外访问属性 public继承:父类成员在子类中保持原有访问级别private继承:父类成员在子类中变为private成员protected继承:父类中public成员会变成protected 父类中protected成员仍然为protected...

2019-08-20 16:42:50 109

原创 友元函数

#include <iostream>using namespace std;class A{public: friend class B;//B类 是 A的好朋友 ,在B中可以访问A类的私有成员 私有函数 //1 声明的位置 和 public private没有关系 friend void modifyA(A *pA, int _a); //2 函数modifyA ...

2019-08-20 14:43:19 240

原创 静态成员变量成员函数

C中的static1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){ printf("...

2019-08-20 09:58:08 207

原创 函数指针

#include<stdio.h>typedef void (*fun)(void) ;void Fun1(void){ printf("Fun1 Run\n");}void Fun2(void){ printf("Fun2 Run\n");}int main(){ fun p; p=Fun1; //两者类型匹配。 p(); // p=Fun2; (...

2019-08-19 20:56:56 97

原创 对象的构造和析构

创建一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。注意,类的数据成员是不能在声明类时初始化的。为了解决这个问题,C++编译器提供了构造函数(constructor)来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。1构造和析构函数1构造函数和析构函数的概念有关构造函数 1构造函数定义及调用1)...

2019-08-17 21:38:42 909

原创 c++中字符串分割(split)

函数第一次调用需设置两个参数。第一次分割的结果,返回串中第一个" " 之前的字符串,也就是上面的程序第一次输出abc。第二次调用该函数strtok(NULL," "),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置线程安全的函数叫strtok_r,运用strtok来判断ip或者ma...

2019-08-16 19:23:08 943

原创 Linux系统编程 进程间的通信

IPC方法Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。...

2019-08-15 21:55:48 282

原创 sscanf的用法

C 库函数 int sscanf(const char *str, const char *format, …) 从字符串读取格式化输入。#include<stdio.h>int main(){ char buf[512]={0}; //1. 常见用法。 sscanf("123456 asdf","%s", buf); printf("%s\n",...

2019-08-13 10:32:43 324

原创 c和c++中的const

c中的const是冒牌货int main(){ const int a = 10; int *p = NULL; p = (int *)&a; *p = 20; //间接赋值 printf("a:%d \n", a); printf("*p:%d \n", *p); return 0;}分别使用c编辑器和c++的编辑器,...

2019-08-08 17:00:27 150

原创 protobuf的使用

首先安装C++的Protobuf,按官方指导来: https://github.com/protocolbuffers/protobuf/tree/master/src下载release包,解压后编译安装即可。用法举例,先定义proto文件,如何定义protobuf网上有很多教程:syntax = "proto3";//实际使用中一般把package注释掉package test;e...

2019-08-06 19:55:44 273

原创 Linux进程、进程控制

进程相关概念程序和进程程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu、内存、打开的文件、设备、锁....)进程,是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)程序 → 剧本(纸) 进程 → 戏(舞台、演员、灯光、道具...)同一个剧本可以在多个舞台同时上演。同样,同一个程序...

2019-08-02 20:18:43 164

原创 linux中的线程安全(二)

信号量进化版的互斥锁(1 --> N) 由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无异。 信号量,是相对折中的一种处理方式,既能保证...

2019-08-02 19:18:45 392

转载 linux多线程之条件变量

转载:https://blog.csdn.net/qq_39736982/article/details/823806891、条件变量概述:条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,所以互斥锁和条件...

2019-08-02 18:56:05 818

转载 c++中的异常类

转载:https://blog.51cto.com/11134889/20688771、C语言异常处理1.1、异常的概念异常:程序在运行过程中可能产生异常(是程序运行时可预料的执行分支),如:运行时除0的情况,需要打开的外部文件不存在的情况,数组访问越界的情况…Bug:bug是程序中的错误,是不可被预期运行方式,如:野指针、堆内存结束后未释放、选择排序无法处理长度为0的数组…1.2、C语...

2019-07-30 21:20:27 1062

原创 c++中避免头文件重复引用

//a.h#ifndef _A_H#define _A_Hclass A{pbulic:A(){}~A(){}}#endif// B.h#ifndef _B_H#define _B_H#include “a.h”class B : public A{public:B(){}~B(){}}#endif// C.h#ifndef _C_H#define _...

2019-07-29 15:50:43 661

原创 c++中map的使用

map的插入 map<int, string> map1; //方法1 map1.insert(pair<int, string>(1,"teacher01") ); map1.insert(pair<int, string>(2,"teacher02") ); //方法2 map1.insert(make_pa...

2019-07-27 20:24:11 185

原创 linux中的线程安全性

互斥量mutexLinux中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。资源还是共享的,线程间也还是竞争的, 但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。但,应注意:同一时刻,只能有一个线程持有该锁。当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程...

2019-07-26 19:53:20 325

原创 c++中随机性的结合使用srand()和rand()的结合使用

首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)根据需要多次调用rand(),从而不间断地得到新的随机数;无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。#include<iostre...

2019-07-26 19:11:45 195

原创 Linux中time()函数用法

time函数获得日历时间。日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。#include <time.h...

2019-07-25 14:24:30 5170

原创 linux中的多线程

线程概念什么是线程(面试必考)(1)进程进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间,至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。(2)线程线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。(3)联系线程是进程的一部分,一个线程只能属于一...

2019-07-18 17:17:21 168

原创 第四章并发编程基础

线程简介什么是线程进程:现代操作系统运行一个程序时,会为其创建一个进程。(进程可以认为是运行着的程序,活着的程序)。线程:现代操作系统的最新调度单位就是线程,线程也称为轻量级进程(Light Weight Process)。一个进程中可以包含多个线程,这些线程有自己的计数器、堆栈、和局部变量属性,并且能够访问共享的内存变量。为什么线程能够同时执行:处理器在不同的线程间高速切换,让使用者感...

2019-07-06 21:15:04 133

原创 第2章 Java并发机制的底层实现原理

本地内存和现场安全问题缓存行:CPU不会直接与内存交互,而是通过总线将数据读到自己的一个缓存行中写缓存区:CPU不会和内存直接交互,会将要读取的数据更改之后先写入自己的写缓冲区,随后刷写缓冲区新到内存中本地内存:这是虚拟出来的概念,实际上并不存在,其襄括了缓存行、写缓冲区等概念线程安全问题:...

2019-07-06 11:57:07 142

原创 inline的使用

(1) inline函数的定义放在头文件中,在头文件中不能够写函数的实习,但是使用inline则可以写函数的实现inline 在大多数 C++ 程序中是编译行为。其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义。因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一...

2019-07-02 19:30:20 338

原创 qt解决qdebug乱码

QVector<QString> s; s.push_back(QString::fromLocal8Bit("张三")); s.push_back(QString::fromLocal8Bit("李三")); s.push_back(QString::fromLocal8Bit("李四")); s.push_back(QString::from...

2019-07-02 16:54:11 1500

原创 第五章Redis之跳跃表

跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其它节点的指针,从而达到快速访问节点的目的。跳跃表支持O(logN)、最坏O(N)复杂度的节点查找,还可以通过顺序性操作来批量处理节点。大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树来的更为简单,所以不少程序都使用跳跃表来代替平衡树。Redis使用跳跃表作为有序集合键的底层实现之一:如果一...

2019-05-11 22:37:35 158

原创 c++中的应用

#include<iostream>#include<vector>using namespace std;vector<vector<int>> res;static vector<int> path;int main(){ path.push_back(1); path.push_back(2); ...

2019-05-07 18:39:24 188

原创 Redis第4章字典

1. 字典的实现哈希表Redis的哈希表定义如下:typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引值 // 总是等于 size - 1 unsigned long sizemask...

2019-05-05 16:40:15 107

原创 memset的使用

https://blog.csdn.net/qq1169091731/article/details/51934504

2019-05-01 17:20:33 230

原创 第三章Redis之链表

链表节点定义typedef struct listNode { struct listNode *prev;//前置节点 struct listNode *next;//后置节点 void *value;//节点值}listNode;链表定义typedef struct list { listNode *head;//表头节点 listNode *tail;//表尾节点 un...

2019-04-30 11:14:12 131

原创 第二章简单动态字符串

1. SDS的定义在Redis中的字符串并不是使用C语言中的char数组保存,而是自定义了一个结构体SDS来保存。redis> SET msg "hello world"OKredis> RPUSH fruits "apple" "banana" "cherry"(integer) 3在上述例子中,不管是key还是val都是使用SDS类型保存。struct sdshdr...

2019-04-29 16:26:59 130

原创 c++

vectorvector可理解为变长数组,它的内部实现基于倍增思想。按照下列思路可以大致实现一个 vector的实际长度和最大长度。向 vector 加入元素前,若n=m,则在内存中申请2m的连续空间,并把内容转移到新的地址上(同时释放旧的空间),再执行插入。从 vector中删除元素后若n≤m/4,则释放一半的空间。vector支持随机访问,即对于任意的下标0≤i<n,可以像数组一样用...

2019-04-19 17:38:47 196

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除