自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Registry Keys for Windows 10 Application Privacy Settings

windows系统注册表对应的隐私设置

2022-11-14 20:37:10 420 1

转载 网络内核之TCP是如何发送和接收消息的

老规矩,带着问题阅读:三次握手中服务端做了什么?为什么要将accept()单独一个线程而不是和读写的io线程共用一个线程池?当调用send()返回后数据就一定到对方或者在网线中传输了呢?1. TCP通信流程服务端我们首先会创建一个监听套接字,然后给这个套接字绑定一个ip和端口,这一步对应的方法就是bind(),之后就是调用listen()来监听端口,端口是和应用程序对应的,网卡收到一个数据包的时候后需要知道这个包是给哪个程序用的,当然一个应用程序可以监听多个端口。之后客户端发起连接内核会分配一

2021-05-05 11:02:53 1341

原创 Ubuntu 18.04安装Mysql

文章目录1. 安装Mysql2. 修改mysql配置文件3. 修改mysql root密码4. 授权主机可以访问当前虚拟机mysql服务1. 安装Mysql(1)apt install mysql-server(2)查看是否安装成功[root@12-VirtualBox ~ 18:48:34]#netstat -tap | grep mysql tcp 00 localhost:mysql 0.0.0.0:* LISTEN3069/my

2021-05-02 12:11:58 210

转载 MySQL的一级索引和二级索引介绍

文章目录1、一级索引2、二级索引3、例子介绍3.1 主键索引结构3.2 非主键索引结构3.3 一级索引和二级索引的关系:回表4.0 二级索引存储主键值而不是存储数据优缺点1、一级索引索引和数据存储在一起,都存储在同一个B+tree中的叶子节点。一般主键索引都是一级索引。2、二级索引二级索引树的叶子节点存储的是主键而不是数据。也就是说,在找到索引后,得到对应的主键,再回到一级索引中找主键对应的数据记录。3、例子介绍下面我们通过一个具体的示例进行演示一级索引和二级索引。有如下表pl_ranking(

2021-04-27 16:03:05 10581 2

转载 shared_ptr的线程安全

文章目录1. shared_ptr的线程安全2. shared_ptr 的数据结构3. 多线程无保护读写 shared_ptr 可能出现的 race condition1. shared_ptr的线程安全shared_ptr 的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafet

2021-04-25 11:45:24 3346

原创 搞定动态库和静态库这一篇就够了

一、创建动态库步骤1. 创建dll工程### 2. 删除多余文件3. 指定dll库文件输出路径$(SolutionDir) — 解决方案目录$(Platform) — 平台目录(x86/x64)$(Configuration) — 编译模式(Debug/Release)4. 指定lib文件输出路径dll文件是函数的实现,lib文件是函数的声明5. 编译后自动拷贝头文件目标文件夹需要预先创建,编译后自动拷贝头文件

2021-04-25 08:57:44 493

转载 VS配置选项MT和MD的区别

目录/MD、/MT的选择区别1:全局堆句柄不一样区别2:链接的运行时库不同区别3:编译出来的PE文件大小区别visual studio运行时库MT、MTd、MD、MDd的研究/MD、/MT的选择1、为什么选择/MD,不选/MT?(1)程序就不需要静态链接运行时库,可以减小软件的大小;(2)所有的模块都采用/MD,使用的是同一个堆,不存在A堆申请,B堆释放的问题;(3)用户机器可能缺少我们编译时使用的动态运行时库。(补充:如果我们软件有多个DLL,采用/MT体积增加太多

2021-04-20 10:37:34 2249

转载 linux常用命令-ps

Linux中的ps命令是ProcessStatus的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得...

2021-04-14 09:03:44 299

原创 构造函数、析构函数抛出异常的问题

目录引子1. 抛出异常1.1 抛出异常语句格式1.2 嵌套调用的异常处理时机2.构造函数可以抛出异常吗?3.析构函数可以抛出异常吗?3.1 more effective c++提出析构函数不能抛出异常的两点理由4.如何处理析构函数中的异常?4.1 析构函数内部消化异常4.2主动关闭程序4.3把可能抛出异常的代码移出析构函数引子先看一个程序,会输出什么?struct A{ A() { cout << "A" <<...

2021-04-10 23:05:04 940

原创 C/C++函数调用的几种方式总结

目录1、为什么需要指定函数调用方式?2、常见的函数调用方式2.1 stdcall2.2 cdecl2.3fastcall2.4thiscall1、为什么需要指定函数调用方式?调用函数时,计算机常用栈来存储传递给函数的参数。在参数传递中,有两个重要的问题必须要明确说明:1. 当参数个数多于一个时,按照什么顺序把参数压入堆栈;2. 函数调用后,由谁来把堆栈恢复原状。C/C++通过函数的调用方式来说明这两个问题的2、常见的函数调用方式stdcall..

2021-03-15 11:21:14 1055

原创 进程地址空间分布

1、一个程序如何执行起来的?首先内存需要的是数据和指令(机器语言)但是程序是高级语言,(1)先通过编译链接生成.exe文件(.exe文件在磁盘中存储,且.exe文件中是机器语言)(2)exe文件通过mmap函数映射到虚拟内存上(3)再通过分段分页机制把需要的指令和数据加载到内存(4)把main函数的入口地址写入到下一行指令寄存器中2、Linux进程标准的内存段布局如下图所示,地址空间中的各个条带对应于不同的内存段(memory segment),如:堆、栈之类的。记住,这些段

2021-03-08 21:57:08 315

原创 C/C++ memmove与memcpy的区别及实现

目录1.函数原型2.与字符串函数strcpy区别3.函数说明4.拷贝情况5.代码实现5.1 memcpy5.2 memmove1.函数原型void* _memcpy(void* dest, const void* src, size_t count);​​​​​​​void* _memmove(void* dest, const void* src, size_t count);2.与字符串函数strcpy区别memcpy与memmove都是对内存进行拷贝可以

2021-03-07 22:50:47 149

转载 C/C++ 对常见字符串库函数的实现

在C中的string.h头文件中存在很多对字符串进行操作的函数,利用这些函数可以方便的对字符串进行操作。下面将对常见的字符串函数进行解释和实现。1、strcpy函数原型:char* _strcpy(char* dest,char* src)函数功能:将str所指由nullptr的字符串复制到dst所指的数组中,并返回dest的指针。函数说明:保证src和dest所指内存区域不能重叠且dest必须有足够的空间来容纳src的字符串。函数实现:char* _strcpy(char* dest, co

2021-03-07 21:52:41 130

原创 重载解惑:const和返回值

目录1、C++中const用于函数重载1、const int/ volatile int/ int 不构成重载2、int*和int*const不构成重载3、const int&和int构成重载4、int&和int构成重载5、const int&和int& 构成重载6、int*和const int*构成重载2、返回值为什么不能加入重载?1、C++中const用于函数重载1、const int/ volatile int/ int 不构成重

2021-03-07 18:28:33 555

转载 sqlite索引的原理

引言这篇文章,里面讲到对于一个41G大小、包含百万条记录的数据库进行查询操作,如果利用了索引,可以把操作耗时从37s降到0.2s。那么什么是索引呢?利用索引可以加快数据库查询操作的原理是什么呢?索引的基本原理数据库提供了一种持久化的数据存储方式,从数据库中查询数据库是一个基本的操作,查询操作的效率是很重要的。对于查询操作来说,如果被查询的数据已某种方式组织起来,那么查询操作的效率会极大提高。在数据库中,一条记录会有很多列。如果把这些记录按照列Col1以某种数据结构组织起来,那么列Col2一

2021-03-05 18:28:41 1069

原创 TCP编程常见问题

1、网络字节序大端字节序2、TCP和UDP区别 UDP TCP 是否连接 无连接 面向连接 是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制 连接对象个数 支持一对一,一对多,多对一和多对多交互通信 只能是一对一通信 .

2021-03-05 09:12:41 437 1

转载 WebSocket 协议

解决的问题基于浏览器的机制,实现客户端与服务端的双向通信.协议概述来自客户端握手GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Origin: http://example.comSec-WebSocket-Protocol: chat, superchatSec-WebSocket-

2021-03-02 14:48:03 264

转载 TCP连接关闭—close和shutdown

目录1、多线程多进程关闭连接的区别2、close的主要流程1)关闭监听句柄2)关闭普通ESTABLISH状态的连接(未设置so_linger)3)使用了so_linger的连接TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。为方便阅读,我们可以带着以下5个问题来阅读本文:1、当socket被多进程或者多线程共享时,关闭连接时有何区别?2、关连接时,若连接上有来自对端的还未处理的消息,会怎么处理?3、关连接时,若连接

2021-03-01 20:51:29 2980

原创 TCP连接建立和关闭状态转移

windows联网访客机软件开发项目1、负责访客业务需求梳理、需求分解以及项目概要设计2、重构单机访客软件代码,通过分层设计的原则,将软件分为UI层、业务逻辑层、网络交互层,单独负责网络交互模块的开发,向业务层提供统一的平台访问接口,同时屏蔽底层网络(TCP、HTTP)接入细节,通过任务队列(线程池实现,支持不同优先级事件)的方式处理网络数据包,再通过观察者模式将处理后的数据分发给不同的业务模块3、重构观察者模块代码,将同步通知的方式改为放到任务队列中异步通知,解决有多个观察者时,通知耗时和一个通知阻

2021-02-28 22:42:58 236 1

原创 C++设计模式 代理模式

动机(Motivation)在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者不影响原有数据模型的情况下有排序过滤功能等), 直接访问会给使用者、或者系统结构带来很多麻烦。 如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式示例代码如下:#include <iostream>using namespace std;class Subject // Subject类定义了Rea

2021-02-21 21:13:44 78

原创 Socket中SO_REUSEADDR/SO_REUSEPORT详解

目录SO_REUSEADDR/SO_REUSEPORT到底什么意思?设置SO_REUSEADDR选项TIME_WAIT有什么意义呢?SO_REUSEADDR/SO_REUSEPORT到底什么意思?SO_REUSEADDR选项有如下语义:这个套接字选项通知内核,如果端口忙,但TCP状态位于TIME_WAIT(Linux下的TIME_WAIT大概是2分钟) ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果你的服务...

2021-02-17 14:34:13 523

原创 链表-LeetCode

一、反转一个单链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL题解:方法一:迭代假设存在链表 1→2→3→∅,我们想要把它改成∅←1←2←3。在遍历列表时,将当前节点的next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!/** * D

2021-02-12 07:46:51 138 1

原创 enable_shared_from_this类的作用和实现

目录问题:如何安全地将this指针返回给调用者enable_shared_from_this的实现分析问题:如何安全地将this指针返回给调用者一般来说,我们不能直接将this指针返回。想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变量并不知道,此时如果外部变量使用这个指针,就会使得程序崩溃。使用智能指针shared_ptr看起来是个不错的解决方法。但问题是如何去使用它呢?我们来看如下代码:struct Bad{ std:.

2021-02-12 07:43:05 429

原创 C++的new和delete详解

1、new操作符的三种使用方式plain new,nothrow new和placement new。(1)plain new顾名思义就是普通的new,只是用于分配内存。在C++中是这样定义的:void* operator new(std::size_t) throw(std::bad_alloc);void operator delete(void *) throw();提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL,因此通过判断返

2021-02-07 15:45:59 552

转载 内存管理机制

1、操作系统如何向程序提供内存:操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。如果程序要访问虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。于是,这里就引出了两种地址的概念:我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address) 实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)。操作系统引入了虚拟内存,进程持有的

2021-02-07 08:17:11 752

转载 进程、线程区别和联系

进程的状态在上面,我们知道了进程有着「运行 - 暂停 - 运行」的活动规律。一般说来,一个进程并不是自始至终连续不停地运行的,它与并发执行中的其他进程的执行是相互制约的。它有时处于运行状态,有时又由于某种原因而暂停运行处于等待状态,当使它暂停的原因消失后,它又进入准备运行状态。所以,在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。进程的三种基本状态上图中各个状态的意义:运行状态(Runing):该时刻进程占用 CPU; 就绪状态(Ready):可运行,但因

2021-02-07 08:15:55 152

转载 互斥锁、自旋锁、悲观锁、乐观锁的应用场景

互斥锁与自旋锁:谁更轻松自如?最底层的两种就是会「互斥锁和自旋锁」,有很多高级的锁都是基于它们实现的,你可以认为它们是各种锁的地基,所以我们必须清楚它俩之间的区别和应用。加锁的目的就是保证共享资源在任意时间里,只有一个线程访问,这样就可以避免多线程导致共享数据错乱的问题。当已经有一个线程加锁后,其他线程加锁则就会失败,互斥锁和自旋锁对于加锁失败后的处理方式是不一样的:互斥锁加锁失败后,线程会释放 CPU,给其他线程; 自旋锁加锁失败后,线程会忙等待,直到它拿到锁;互斥锁是一种「独.

2021-02-03 20:16:24 247

原创 无锁编程:c++11基于atomic实现共享读写锁

在多线程下,对临界资源的访问需要加锁,可以选择互斥锁这样的粗粒度锁或者基于CAS指令的原子语句实现互斥访问。关CAS等原子操作的概念参见下面的文章:无锁队列的实现以下代码利用atomic实现了一个轻量级的读写资源锁,保证有线程在读取时,写入线程阻塞,当写入线程执行时,所有的读取线程都被阻塞,并且可以根据需要通过构造函数参数设置读/写优先,且locck/unlock语句允许嵌套,相比利用互斥锁实现的读写锁,本锁更类似自旋锁lock.readLock();lock.readLock();.

2021-02-02 21:23:14 1366 1

原创 C语言内存对齐和结构补齐

一、为什么要字节对齐?32位CPU是以双字(DWORD)为单位进行数据传输的,因此我们的数据无论是8位或16位都是以双字进行数据传输。比如,一个int类型4字节的数据如果放在上图内存地址1开始的位置,那么这个数据占用的内存地址为1~4,那么这个数据就被分为了2个部分,一个部分在地址0~3中,另外一部分在地址4~7中,又由于32位CPU以双字进行传输,所以,CPU会分2次进行读取,一次先读取地址0~3中内容,再一次读取地址4~7中数据,最后CPU提取并组合出正确的int类型数据,舍弃掉无关数据。那么反过

2021-01-30 15:55:21 464

原创 搞懂C++ 对象的内存布局这一篇就够了(代码图文详解)

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。虚函数表对C++了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为..

2021-01-30 15:36:14 630

原创 宏定义中 #和##的区别

1、#构串操作符# 将右边的宏参数做整体的字符串替换。 #define STRING(x) #x#x #define TEXT(x) "A"#x"A" int main() { printf("%s\n", STRING(Test)); printf("%s\n", TEXT(Test)); getchar(); } STRING(Test) --->宏展开--->...

2021-01-28 22:06:56 312

原创 C++11/14 constexpr 用法

1、constexpr 和 constconst 的原本和基础的含义是表示它修饰的内容不会变化,本质上,const 用来表示一个运行时常量。如: const int n = 1; n = 10; //报错 但是我们依然可以通过指针来修改n在内存中的数据 const int n = 1; int* p = (int *)&n; *p = 10; std::cout <<...

2021-01-28 22:05:13 480 2

原创 泛型编程:编译期类型检查

用 C11引入的true_type 和 false_type 来选择合适的重载,利用这个我们可以在编译期通过标签分发(tag dispatch)来限制输入参数类型,比如格式化字符串的时候,string类型错误并不会报错,但是运行期会导致崩溃1、我们下看下true_type 和 false_type的定义: // TEMPLATE CLASS integral_constant template<class _Ty, _Ty _Val> st...

2021-01-28 21:51:53 367

原创 函数对象和lambda:函数式编程

1、C++98 的函数对象从概念上来说,函数对象是一个可以被当作函数来用的对象。它有时也会被叫做 functor,代码看一个函数对象: struct CAverage { public: double operator()(int a1, int a2) { //重载()运算符 return (double)(a1 + a2) / 2; } }; int main() ...

2021-01-28 21:49:10 70

原创 内存顺序(Memory Order)问题

先理清几个前提:1、CPU不能直接操作内存,CPU是通过 寄存器、缓存 等间接修改内存变量中的值2、编译器在编译的时候,基于优化可能会对进行指令重排3、运行期,为了提升执行效率,CPU内部可能也会进行指令重排内存模型对于大部分开发者而言,在写单线程程序,或者基于锁(Mutex)和信号量(Semaphore)之类编程框架提供的同步元语写多线程程序的时候,并不需要关心内存顺序的问题。 这是因为编译器和硬件架构保证了,虽然指令执行顺序可能跟开发者写的代码语句的顺序不一致,但是执行后的结果是一样

2021-01-28 21:46:37 1847 1

原创 单例模式和多线程

1、单例模式和多线程不考虑多线程,单例可以代码如下: class Singleton { public: static Singleton* instance(); private: static Singleton* pInstance; }; Singleton* Singleton::pInstance = nullptr; Singleton* Singleton::instance()...

2021-01-28 21:46:03 245

转载 彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0

通俗的了解IP地址是什么对于IP地址,大家并不陌生,特别是在网络访问中我们会经常使用到(平时对域名如百度的www.baidu.com的访问,本质就是对域名所绑定的IP地址的访问),那么IP地址是什么呢?首先,我们要知道网络中的相互访问其实就是在进行两者间的数据传递。就如同送快递一样,快递发出只有知道你的住址信息,才能将快递送到你的手中。而在网络访问时,只有知道你在网络中的地址信息,才能将数据发送到你的设备上。所以,IP地址就是你在网络中的地址信息。与你现实地址不同的是,你的现实地址使用文字表示,而你

2021-01-21 15:08:20 718

原创 自己动手,实现C++的智能指针

智能指针,可以简化资源的管理,从根本上消除资源(包括内存)泄漏的可能性。其实,智能指针本质上并不神秘,其实就是 RAII 资源管理功能的自然展现而已,下面提供一种实现。/*******************************************************文 件: CSmartPoint.h描 述: 智能指针类,不支持多线程操作修 改:********************************************************/#pra

2021-01-13 21:20:43 290

原创 解决:无法解析的外部符号__iob_func

1、项目开发过程中,调用一个静态库,刚开始遇到编译问题:无法打开文件"LIBC.lib"解决:在“项目”-->“配置属性->链接器->输入->忽略特定库”后填入“LIBC.lib ”原因:如果将用低版本的VC开发的项目,拿到高版本的VC开发环境上去编译,链接时也许会触发LNK1104错误,解决方案是链接时忽略此库。Run-Time Library是编译器提供的标...

2020-05-06 18:41:59 3674

原创 Log4j根配置文件

Log4j简介Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。...

2019-08-20 20:49:26 128

空空如也

空空如也

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

TA关注的人

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