
C\C++
文章平均质量分 61
后台服务器开发
这个作者很懒,什么都没留下…
展开
-
一起探索C++类内存分布
一起探索C++类内存分布C++ 类中内存分布具体是怎么样,尤其是C++中含有继承、虚函数、虚拟继承以及菱形继承等等情况下。由于在linux下没有windows下显示直观,我们采用vs2015进行调试。部署环境我们在 属性->C/C++ ->命令行 -> /d1 reportSingleClassLayoutXXX ,XXX表示类名;单个基础类class Base{private: int a; int b;public: void test();原创 2021-02-08 20:42:16 · 256 阅读 · 1 评论 -
C++ 模板 全特化与偏特化
C++ 模板 全特化与偏特化模板模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。大白话:C++是一门强类型语言,编写一段通用的逻辑,可以把任意类型的变量传进去处理,通过把通用逻辑设计为模板,摆脱了类型的限制,极大地提升了代码的可重用性。**模板实例化:**模板定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进 行编译。用户提供不同的类型参数原创 2021-01-23 10:19:36 · 328 阅读 · 0 评论 -
禁止拷贝构造,禁止bug
禁止拷贝构造,禁止bug一、前言 首先,我先讲讲为什么会写这篇文章;这个也是翻阅自己之前博客,当时看开源代码的时候,总是很奇怪,为什么有的代码中会会出现类似于Epoll( const Epoll& ) = delete;这样的代码产生,当时大概查阅了一下资料,只是说这个代码的意思是将默认的拷贝构造函数禁止了,但是并没有了解到为什么这样做,直到前几天思考了这个问题,觉得有必要写下来,并且分享一下,也为自己做一个笔记,在今后的开发过程中,多留一个心眼,少踩一个坑~二、拷贝构造函数我们先原创 2020-10-24 08:01:19 · 831 阅读 · 0 评论 -
探索静态库与动态库的“奥秘”
探索静态库与动态库的“奥秘”什么是库?所谓“库”,就是稳定成熟的可以复用的代码;库从本质上来说是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a(linux)、.lib(windows))和动态库(.so(linux)、.dll(windows))。所谓静态、动态是指链接,可以看下编译链接的过程:库与可执行文件区别:库文件无法直接执行,从生产库的源码中可以查看出,源码是没有main函数,都是一些函数模块的定义和实现,由于没有主入口,所以无法直接运行库。原创 2020-10-24 07:59:47 · 275 阅读 · 0 评论 -
大道至简—循环队列
大道至简—循环队列一、前言 队列可能是大家学习linux通讯时接触到的知识,当然也是我们在编程中使用较多的一个点,其中最主要的一方面用来降低程序之间的耦合度,还有异步操作; 前段时间在公司写了一个小的服务,同样使用了队列对服务进行了异步操作,知识队列没有使用现有的一些大型库,自己使用了原生的STL队列中的接口,进行了简单的封装,当前对代码调优不够,后来才发现有很多的漏洞影响着性能;其中就有一条是引发今天这篇文章的元素——在程序中,需要不断的申请释放内存,这样就影响了程序的性能; 使原创 2020-09-18 08:00:26 · 287 阅读 · 0 评论 -
windows程序崩溃调试终极武器
windows程序崩溃调试终极武器—dump文件一、前言前不久开发了一款windows程序,目前已经是测试跑了,对于windows程序熟悉的童鞋,应该都知道一个事,就是他运行时有一个黑框,如果崩溃的就是下面这种情形~[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QBnXE8go-1599873016190)(https://imgkr2.cn-bj.ufileos.com/3d8c2beb-b08a-4fc2-9486-3486f2ea1a9c.png?UCloudPu原创 2020-09-12 09:11:21 · 572 阅读 · 0 评论 -
揭开高性能服务器底层面纱
揭开高性能服务器底层面纱一、前言我们经常听说高性能服务器,那什么是高性能服务器;用大白话来解释就是说处理事件快,效率高,占用服务器资源少,多路复用等等集万千宠爱于一身;但是,往往要想做到高性能,这是非常难的,需要一个好的优秀的架构和底层接口。这篇文章只限于linux平台,对于windows平台下,可以去参考下IOCP的用法,这里就不多说了~目前主流的高性能服务器底层都是封装了EPOLL接口,使用epoll进行事件处理,为什么epoll可以作为高性能服务器底层事件处理?那就让我们从源码下手,来揭开面纱原创 2020-09-06 09:09:22 · 411 阅读 · 0 评论 -
聊一聊 C++的特性 explicit && 匿名空间
聊一聊 C++的特性 explicit && 匿名空间explicit关键字首先看一下explicit的作用:explicit 是避免构造函数的参数自动转换为类对象的标识符,平时代码中并不是经常用到,但是,有时候就是因为这个,会造成一定的BUG出现,而我们却苦苦查询不到问题;下面看一个例子来说明下:案例一test.cpp#include <iostream>using namespace std;class Test{public: Test原创 2020-06-06 08:49:20 · 244 阅读 · 0 评论 -
内存池设计与实现
内存池设计与实现一、前言作为C++程序员,想必对于内存操作这一块是比较熟悉和操作比较频繁的;比如申请一个对象,使用new,申请一块内存使用malloc等等;但是,往往会有一些困扰烦恼着大家,主要体现在两部分:申请内存后忘记释放,造成内存泄漏内存不能循环使用,造成大量内存碎片这两个原因会影响我们程序长期平稳的运行,也有可能会导致程序的崩溃;二、内存池内存池是池化技术中的一种形式。通常我们在编写程序的时候回使用 new delete 这些关键字来向操作系统申请内存,而这样造成的后果就是每原创 2020-05-12 13:54:35 · 599 阅读 · 0 评论 -
恭喜你!发现宝藏一份---干货技术文章汇总
技术文章汇总点个【在看】谢谢你,分享让更多热人加入我们的群体自从开通【CPP后台服务器开发】微信公众号以来,收获了不少读者的青睐,为此非常感谢大家;由于工作原因,一周基本会更新一到两篇文章,有基础的,也有比较深入一些的,差不多都是平时工作中遇到的或者查漏补缺的,希望和大家一起分享;今天是周日,突然想着,现在也写了很多文章,很多都被冲到后面去了,一直没时间汇总,今天将自己所有的文章做一个归类和汇总,并且以后每篇文章都附带这篇文章,希望和大家一起进步!路漫漫其修远兮,吾将上下而求所!我们一起加油原创 2020-05-10 09:06:21 · 1171 阅读 · 0 评论 -
我们需要懂得CMake文件
我们需要懂得CMake文件一、前言 从事于linux下的C++开发的人员都知道,在C++下编写程序是没有类似windows下编译器的一键编译和运行的按钮,只能由我们开发人员进行手动编译、运行;为了减免这种繁琐而且复杂的劳动力,出现了makefile文件,makefile文件可以帮助我们很快的编译大量文件,最终形成可执行文件;其实编写makefile文件并不是很复杂,但是后面出现了cmak...原创 2020-03-29 14:28:31 · 4707 阅读 · 1 评论 -
linux服务器程序性能调试
linux服务器程序性能调试CPUCPU使用率:除了空闲时间外的其他时间占总 CPU 时间的百分比平均CPU使用率:1-(新得空闲时间-老空闲时间)/(总新的CPU时间-总旧的CPU时间)注:我们前面介绍的性能分析命令都是间隔一段时间的平均 CPU 使用率,所以要注意间隔时间的设置perf 简介及安装Perf 是内置于Linux 内核源码树中的性能剖析(profiling)工具。...原创 2020-03-21 09:51:06 · 421 阅读 · 0 评论 -
redis分布式锁?坑那么多
redis分布式锁?坑那么多一、白话分布式什么是分布式,用最简单的话来说,就是为了较低单个服务器的压力,将功能分布在不同的机器上面;就比如:本来一个程序员可以完成一个项目:需求->设计->编码->测试但是项目多的时候,一个人也扛不住,这就需要不同的人进行分工合作了这就是一个简单的分布式协同工作了;二、分布式锁首先看一个问题,如果说某个环节被终止或者别侵占,...原创 2020-03-14 18:43:32 · 730 阅读 · 2 评论 -
boost库使用—函数回调
boost库使用—函数回调result_of确定表达式的类型包含头文件:#include <boost/utility/result_of.hpp>using namespace boost;案例:#include <iostream>#include <boost/utility/result_of.hpp>using namespac...原创 2019-12-29 18:28:05 · 261 阅读 · 0 评论 -
C++11 线程共享状态
C++11 线程共享状态一、问题提出首先,我们假设一种情况,在多线程中,出现这么一种情况:两条线程:thread1 和 thread2某种特殊环境中,thread2需要得到thread1中的某个值才能进行数据处理,那怎么做才能达到这种效果?方法一:在主线程中等待,直到thread1处理完后,按顺序处理thread2;但是这种效率太低,导致主线程一直阻塞等待方法二:同时开启两个线...原创 2019-12-08 09:38:28 · 551 阅读 · 0 评论 -
C++11 async
C++11异步 async一、简介**std::async()**是一个接受回调(函数或函数对象)作为参数的函数模板,并有可能异步执行它们.函数原型:template<class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async(launch policy, F...原创 2019-10-13 14:54:40 · 194 阅读 · 0 评论 -
虚拟内存
虚拟内存一、起源我们先看看以前的“虚拟内存”,哈哈,其实以前是没有“虚拟内存”这个东西存在的;我们扒一下他们的历史:先讲一个故事:一间办公室,只有一个工位可以使用,也就是意味着,每次只能有一个人能办公,其他人想要办公部就的排队,等待;随后,在办公间设立了很多的工位,每一个工位对应一个地址,每个人根据自己的编号找到自己的工位地址,这样大大的提升了效率,而且互补干扰;同理,我们的虚拟内存也...原创 2019-10-07 15:53:46 · 367 阅读 · 0 评论 -
C++11异步 async
C++11异步 async一、简介**std::async()**是一个接受回调(函数或函数对象)作为参数的函数模板,并有可能异步执行它们.函数原型:template<class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async(launch policy, F...原创 2019-09-24 21:12:21 · 765 阅读 · 0 评论 -
匿名函数lambda表达式
匿名函数lambda表达式在C++11中引入了匿名函数,也就是所谓的lambda表达式;其实这个表达式在python、JAVA等语言中早就已经存在了,但是很不建议大家使用这个表达式;原因是这种表达式一出现,很多人都是蒙圈的,但是偏偏有很大一部分人喜欢使用,简便;程序员的世界是不懂的,只能随他们去吧!!!但是,作为一名程序员,自己不写这类惹人蒙圈的东西,但是要能看的懂这类骚操作~~~一、l...原创 2019-09-21 12:37:58 · 1070 阅读 · 0 评论 -
厉害了,监控程序
厉害了,监控程序在程序员的生活中,往往会见识到很多高大上的程序;这两天做项目,需要做一个监控C++程序是否运行的,并且程序挂掉后需要自动重启程序;第一个想到的方案是监控进程,但是重新启动程序,却并不是那么容易;好在我们平时一直接触一门强大的“胶水”语言——python,可以完美的完成这两个任务,监控可重启。思路:1.启动定时线程2.检测进程是否存在3.不存在则启动程序接下来,我们...原创 2019-09-09 22:07:01 · 893 阅读 · 0 评论 -
C++返回对象与引用
C++返回对象与引用其实,大家在写C++代码的时候,都会发现,有些函数的返回是引用,有些函数发的返回是对象,今天我们一起来做一下区分。1.根源返回对象和返回引用的最主要的区别就是函数原型和函数头看一下例子:Test get(const Test&) //返回对象Test& get(const Test&) //返回引用2.操作性这里的操作性指的是在...原创 2019-08-25 07:41:22 · 3253 阅读 · 0 评论 -
boost库function与bind
boost库function与bind一、function头文件:boost/function.hppfunction更合适的说法我觉得是一种回调函数的表现方式。boost::function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛化,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。在声明 functio...原创 2019-08-17 18:21:03 · 322 阅读 · 0 评论 -
python调用C++
python调用C/C++程序1.可行性python的底层大部分都是C/C++实现,python和C和C++具有天然的互相调用优势;很多核心的算法库都是C/C++写的,在python开发过程中,经常访问别人的动态库;所以,用python调用C/C++程序是可行的。2.python访问C/C++的方式ctypespybind11cffiswig我们一般使用的是ctypes...原创 2019-08-11 14:32:13 · 720 阅读 · 0 评论 -
深度探索C++对象模型四
深度探索C++对象模型四1.virtual member functions(虚拟函数成员)来自原书:如果normalize()是一个virtual member function,那么下面的抵用会被转成:ptr->normalize();会转成:(*ptr->vptr[1])(ptr);vptr:表示由编译器产生,指向虚函数表,被安插在每一个“声明有(或者继承...原创 2019-08-03 15:28:45 · 376 阅读 · 0 评论 -
GDB不同文件断点调试
GDB不同文件断点调试作为一个linux下C/C++开发人员,调试工具是必不可少的一项技能,在windows平台,会有很多工具给我们用,比如VS,自带很强大的调试工具。当然,linux平台夜市毫不逊色,GDB工具是一个非常强大的代码调试工具。今天主要介绍的是GDB在多文件中的调试方法,不会一一介绍基础命令的。一、同一个目录中的文件现在,有三个文件,分别为main.cpp、test1.cp...原创 2019-08-03 09:04:18 · 3710 阅读 · 0 评论 -
深度探索C++对象模型读书笔记 三
深度探索C++对象模型读书笔记 三C++深度探索<三>1.空的class是1个字节 大家看一下这个程序:#include using namespace std;class Demo{};int main(){Demo do;cout<<“sizeof(Demo):”<<sizeof(Demo)<<endl;return 0;...原创 2019-07-21 11:03:42 · 240 阅读 · 0 评论 -
深度探索C++对象模型读书笔记 二
深度探索C++对象模型读书笔记<二>在使用C++时,常常会好奇或者抱怨,编译器为我们做了什么事呢? 为什么构造函数没有为我初始化呢?为什么我还要写默认构造函数呢?2.1 Default Constructor 的构造操作如果没有声明默认构造函数,编译器会在需要的时候帮我们产生出来。 为了避免在多个地方被需要导致重复,则编译器将产生的构造函数声明为inline方式。class ...转载 2019-07-14 16:37:44 · 199 阅读 · 0 评论 -
C++ 对象深度探索笔记一
C++ 对象深度探索笔记<一>1.封装的成本首选,我门来看一下C语言中的结构体,当然也可以看做事一个“封装”,我称为它结构体的封装,其实就是里面包含了很多的元素。#include<iostream>using namespace std;typedef struct Md{ int num; char name[256];}MD;void MdPri...原创 2019-07-11 22:42:19 · 231 阅读 · 0 评论 -
mysql->redis同步
hello,大家好,今天看到一篇redis相关的文章,我自己专门把代码搞到跑了一下,还是不错的,对于我们平时使用redis和mysql同步还是很不错的,工作中也是可以去使用的,因为这个确实会比我们去使用代码的方式去读取数据库再次插入到redis中,效率会高的多。1.开发环境开发环境:linxu开发语言:C/C++ mysql使用的库:hiredis2.redis通信协议(1...原创 2019-06-16 21:34:36 · 1028 阅读 · 0 评论 -
你懂写日志的策略吗?不懂,就不是合格的服务器工程师
你懂写日志的策略吗?不懂,就不是合格的服务器工程师在平时我们开发程序的时候,我们经常会想把一些数据作为日志来记录,尤其是我们做服务端的,日志往往是特别重要的,不管是我们后面的拍错,还是查看程序的运行状态,都需要借助日志来分析。但是,实际开发中,往往会借助第三方的库或者让是开源库的方式。但是,在平时小型的项目中的话,这么做往往是应了那句话,...原创 2019-06-07 08:06:40 · 258 阅读 · 0 评论 -
Redis从入门到使用
初识Redis Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。 Redis的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原...原创 2019-03-03 13:25:53 · 226 阅读 · 0 评论 -
守护进程?竟然这么简单
守护进程 在linux系统中,我们会发现在系统启动的时候有很多的进程就已经开始跑了,也称为服务,这也是我们所说的守护进程。 守护进程是脱离于终端并且在后台运行的进程,脱离终端是为了避免在执行的过程中的信息在终端上显示,并且进程也不会被任何终端所产生的终端信息所打断。 守护进程一般的生命周期是系统启动到系统停止运行,当人,什么都敌不多人,也可以通...原创 2019-02-15 22:30:25 · 643 阅读 · 0 评论 -
内存检测王者之剑—valgrind
记得在大学的刚开始学习C/C++的时候,对于内存问题一点也没有关心过,其实也是关心比较少,知道后来才慢慢注意起来,当时排查是否有内存泄漏全靠手,去看看malloc和free或者new和delete是否对应起来,这也是一种比较简单的查询是否有内存泄漏的办法,后来老师提供了一种用程序来检测是否有内存泄漏,其实就是重载new和delete的方法。 今天,我们一起来学习一...原创 2019-02-12 19:13:59 · 393 阅读 · 0 评论 -
C++设计模式之模板模式
C++设计模式之模板模式定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。其实这个设计模式是比较简单的一个密室,换句话来说就是利用虚函数,把一些步骤延迟到子类中进行实现,设计模式中经常会说这么一句话不稳定的函数写成虚函数,稳定的函数写成非虚函数,接下来,我们看看它的类图接下来,我们用模板模式实现一个函数;...原创 2018-11-06 20:51:59 · 311 阅读 · 0 评论 -
C++组合(聚合)与C结构体中包含函数
C++组合(聚合)与C结构体中包含函数今天突然想到C++的聚合,以前一直没有注意,今天想到就写下来,做个笔记;C++的类与我们的C语言中的结构体特别像,但是有有些不太一样,这里不多累赘了不能,大家学过的都知道。C++组合(聚合)我们知道的都是C++的类的对象,也就是实例化的过程,但是,有时候一些类我门需要他以聚合的形式来使用,比如设计模式里面用的比较多一些。接下来,我门看一个例子:...原创 2018-11-01 20:01:43 · 1230 阅读 · 0 评论 -
重要的sscanf,sscanf_s
#include<stdio.h>定义函数 int sscanf (const char str,const char format,……..);函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。返回值 成功则返回参数数目,失败则返回-1,错误原因存于errn...转载 2018-08-24 07:03:47 · 370 阅读 · 0 评论 -
C/C++回调函数(Callback)& 函数指针
转:https://blog.youkuaiyun.com/qingdujun/article/details/69789300摘要:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。按照...转载 2018-08-19 22:47:32 · 611 阅读 · 0 评论 -
简单易懂的makefile
Makefile之前转载过一篇makefile的编写教程,但是似乎可读性并不是那么高,所以以自己的总结和学习来谈谈mkfile怎么编写。1.首先,我们来看一下make make是linux自带的构建器,构建的规则在makefile中,编译器是使用gcc。 2.makefile的命名规则 - makefile - Makefile3.makefile的规则 gcc a.c b....原创 2018-07-27 22:04:29 · 321 阅读 · 0 评论 -
Github 使用教程
1.首先,我们普及一下什么是github,please click on me,其实用我的话来说就是相当于一个大的仓库,可以存储我们的代码,可以进行多的任务;当然,这也是一个分享的平台,我们建立public仓库,其他人也可以进行访问,参与这个共享库。那这个最大的用就是是一个开源的平台,可以供全球从事IT行业的人交流,学习。我们中国用的最多的博客平台是优快云,而全球程序员用的最多的就是Github...原创 2018-03-18 18:34:18 · 345 阅读 · 0 评论 -
单例模式
单件模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。和全局变量一样方便,又没有全局变量的缺点,即不需要从一开始就创建对象,而是在需要时才创建它 单例模式中分为饿汉模式和懒汉模式 由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。在访问量较小时,采用懒汉实现。这是以时间换空间。 懒汉模式:就原创 2018-01-19 10:17:46 · 180 阅读 · 0 评论