自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 backtrace函数与assert断言宏封装

这篇文章是在阅读 sylar 框架时,对断言宏的封装所做的总结。在实际开发中,我们经常会遇到一种境况:如果程序执行的不是我们想要的正确结果,需要程序立即中断执行,我们希望得到其有效的错误信息,比如其出现错误的函数、文件、代码行号、和参数文本、调用堆栈信息等。通常我们会在程序中使用断言 assert,因为如果出现了不符合条件的情况,程序将终止执行,而且会打印出一些有限的信息。assert 函数断言就说明是绝对不可能出现的错误,一旦出现就不能让程序继续执行下去,而且需要在 debug 阶段将 assert

2021-07-21 00:17:17 593 1

原创 关于gcc的__builtin_expect分支预测优化

在阅读 sylar框架源代码上看到了使用 __builtin_expect 的宏定义,一时有所不解,于是查找了很多资料,对并其做整理。Linux 下的很多代码我们经常看到 likey() 和 unlikely() 这两个宏,通常这两个宏定义是如下这样的形式:#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)可以看出这两个宏都是使用了函数 __builti

2021-07-20 23:53:47 490 1

原创 C++虚继承中的虚基类表

虚继承主要解决多重继承会在子类中存在多份拷贝的问题,这不仅浪费空间,而且存在二义性。在之前的 C++ 继承中已经说过虚继承基本概念,这里不再赘述。这篇文章主要探究虚继承的原理。文章中多处给出了类实例对象的内存布局,查看其内存布局时,使用 VS 工具 /d1 reportAllClassLayout 进行查看,关于这个工具的详细介绍,请点击这里。虚继承的实现原理虚继承的底层实现一般与编译器相关,一般会通过虚基类表指针和虚基类表实现,先看如下这个程序:#pragma pack(1)class A{

2021-07-19 02:07:01 2121

原创 C++多态中的虚函数表

C++中的虚函数表之前的 C++ 继承中已经说过多态基本概念,这里不再赘述。再下面多处给出了类实例对象的内存布局,查看内存的布局时,使用 VS 工具 /d1 reportAllClassLayout 进行查看,关于这个工具的详细介绍,请点击这里。虚函数表的原理解析C++ 虚函数表主要出现在多态情况下。这里我们先从单继承下说明其虚函数表的原理,后面再说多继承情况下的。每个有虚函数的类的实例对象都有一个虚函数表指针成员,该虚函数指针一般位于对象存储空间的起始位置(相较于对象存储空间的起始位置偏移量为 0

2021-07-18 21:19:59 969

原创 使用VS查看类实例的内存布局

使用VS查看类实例的内存布局图因为 MSVC 下使用 /d1 reportAllClassLayout 开关可以很方便的查看内存布局图,可以查看虚表,内存占用大小等。其使用方法是:首先确保电脑安装了 VS,我安装的是 VS2019,在 Win10 的开始菜单中依次找到:Visual Studio Tools -> x64 Native Tools Command Prompt for VS 2019 -> 打开,会进入 CMD 界面,然后切换到你的代码目录,比如我的代码在 CppTest 目

2021-07-18 20:29:45 2280

转载 Ubuntu下安装LLVM/Clang

关于lLLVM和Clang参考原文:https://blog.csdn.net/SiberiaBear/article/details/103111028LLVM 起初的作者是 Chris Lattner。博硕期间研究关于编译器优化的东西,其中一篇论文中提出了一套在编译时、连接时、运行时、闲置时的优化策略,llvm 的基本思想也大概确定下来。在这之前,apple 公司一直使用 GCC 作为编译器,但是 GCC 对 apple 的 Objective-C 支持不够完善,Apple 自己开发的 GCC 模块

2021-07-18 13:42:18 7358

原创 TscanCode代码扫描工具

TscanCode介绍TscanCode 是腾讯研发的静态代码扫描工具,最早的版本是基于 cppcheck 二次开发。之后又重新自研,不仅支持 C++,还支持 C#,Lua 语言,在发掘 C++ 空指针、越界、未初始化、C#空引用、Lua变量未初始化等比较有效。TScanCode 比较适用于游戏开发代码扫描,有着不错的准确率和效率,其性能测试可以见:https://blog.csdn.net/wetest_tencent/article/details/51516347。TscanCode 主要能够发现

2021-07-17 16:50:09 14792 9

原创 C++继承

继承C++ 继承的一般形式如下:class DeriveClassName : Inheritlabel BaseClassName{ //...};DeriveClassName:派生类的名称。Inheritlabel:继承权限(public、protected、private),基类成员在派生类中的可见性。BaseClassName:父类名称。子类继承父类时是全盘继承,父类所有的东西都继承给子类,除了父类的构造和析构不继承。如下程序:#include <iostream&g

2021-07-17 01:17:56 526 1

原创 Go语言—函数

函数Go不是一门纯函数式的编程语言,但是函数在Go中是“第一公民”,表现在:函数是一种类型,函数类型变量可以像其他类型变量一样使用,可以作为其他函数的参数或返回值,也可以直接调用执行。函数支持多值返回。支持闭包。函数支持可变参数。Go是通过编译成本地代码且基于“堆栈”式执行的,Go的错误处理和函数也有千丝万缕的联系。函数定义函数是Go程序源代码的基本构造单位,一个函数的定义包括如下几个部分:1.函数声明关键字func2.函数名3.参数列表4.返回列表5.函数体。函数名遵循标识

2021-07-17 00:54:23 627

原创 Go语言—变量、数据类型、控制结构

第一个Go程序第一个简单的HelloGo程序hello.gopackage mainimport ( "fmt")func main() { fmt.Println("hello,Go!")}定义一个包名位main,main是可执行程序的包名,所有Go源文件必须有一个包声明语句,通过包名管理命名空间import 引入一个外部包 fmt,可以是标准库的包,也可以是第三方自定义的包,fmt是标准输入/输出包func 关键字声明定义一个函数,函数名为main,main代表程序的入口函

2021-07-17 00:51:15 130

原创 Windows下Go安装&环境配置&编译运行

Go下载安装官方 Go下载站点:https://golang.google.cn/也可以选择:https://studygolang.com/dl配置环境变量常用环境变量GOROOTGOROOT是Go的安装目录,在Windows中,GOROOT的默认位置是C:/go,而在Mac OS或者Linux中GOROOT的默认位置是/usr/local/go,如果Go安装在其他目录,而需要将GOROOT的位置修改为对应的目录。另外,GOROOT/bin下包含Go为我们提供的工具链,因此应该将GORO

2021-07-17 00:39:17 3467

原创 VSCode配置Go插件和第三方拓展包

前言VSCode 现在已经发展的相当完善,很多语言都比较推荐使用 VSCode,Go 语言也同样。下面将介绍怎么在 VSCode下配置 Go 环境,前提你电脑已经有了 Go 环境和最新版本 VSCode。插件安装直接在拓展插件中搜索 Go,就可以安装 Go 插件安装之后 vscode 会弹出该插件还需安装一些扩展工具支持,但是这些工具往往会下载失败,或者仅仅成功一部分比如:Installing github.com/nsf/gocode FAILEDInstalling github.com

2021-07-17 00:24:27 1363

原创 解决Qt程序打包后无法运行并提示缺少库文件

编译程序以 Release 方式编译生成 exe 程序.exe 就在你源码的同目录 build-MicroChat-Desktop... 下,直接双击打开会提示缺少一些库。依赖库先新建一个文件夹,将这个 .exe 文件移动到这个文件夹中,首先使用对应的编译器的 Qt 命令行,一般在开始菜单的Qt文件夹下(例如:Qt5.12.4(MSVC 2017 64bit)),然后打开,输入 cd /d D:\HelloWorld(你的路径),使用 windeployqt 命令执行 windeployqt Hel

2021-07-17 00:12:19 4598 2

原创 CentOS8安装&简单配置

CentOS 8 U盘安装出现dracut问题首先遇到的问题是,将镜像刻录到U盘,然后启动U盘安装,出现了dracut:/#,查了些博客,大概就是因为系统找不到U盘的引导,可能是在Windows系统上刻录CentOS的镜像的问题。解决办法:查看设备:cd dev/,然后ls,如果有U盘安装,就会有sd**之类的设备。使用命令:blkid,对查询设备上的引导项,就可以轻松找到U盘设备,我的是sdb1。记下U盘的设备号,按 CRTL+ALT+DELETE 重启电脑。重新进入选择安装界面

2021-07-16 01:05:19 2538

原创 有向图的邻接矩阵与邻接表详细实现

有向图的邻接矩阵通过邻接矩阵来表示有向图。如下如所示:上面的有向图G2包含了“A, B, C, D, E, F, G”共7个顶点,而且包含了“<A, B>, <B, C>, <B, E>, <B, F>, <C, F>, <D, C>, <E, B>, <E, D>, <F, G>”共9条边。上图中右边的矩阵是有向图G2的邻接矩阵示意图。A[i][j] = 1表示第i个顶点到第j个顶点是一条边

2021-07-16 00:58:43 31605 1

原创 无向图的邻接矩阵与邻接表详细实现

无向图的邻接矩阵通过用邻接矩阵来表示无向图。如下无向图G1的邻接矩阵:无向图G1包含了“A, B, C, D, E, F, G”共七个顶点,而且包含了“(A, C), (A, D), (A, F), (B, C), (C, D), (E, G), (F, G)”共七条边。由于这是无向图,所以(A, C)和(C, A)是同一条边,这里列举边时,按照字母先后顺序列举的。无向图G1右边的邻接矩阵在内存中的邻接矩阵示意图。A[i][j] = 1表示第i个顶点与第j个顶点是邻接点,A[i][j] = 0表示它

2021-07-16 00:57:59 11535

原创 图的基本概念

图的概念图是由一些点vertex和这些点之间的连线边edge组成,通常记作:G = (V, E)。图的种类根据图是否有方向,可以将图划分为:无向图和有向图。无向图无向图如下如G1所示,无向图的边都是不区分方向的。G1 = (V1, {E1})。其中:V1 = {A, B, C, D, E, F}。V1表示由“A, B, C, D, E, F”几个顶点组成的集合。E1 = {(A, B), (A, C), (B, C), (B, E), (B, F), (C, F), (C, D), (E, F

2021-07-16 00:57:04 487

原创 CentOS7下使用C/C++连接MariaDB/MySQL

前言连接数据库通常在 Java 的 JDBC 中使用比较多,但是 C/C++ 服务器在 Linux 下操作数据库也比较常见,在网上查了很多资料,并通过自己摸索,终于成功的连接上 MariaDB,记录一下做个参考。开发环境是阿里云 CentOS7 64 位,使用 yum 安装 MariaDB,安装教程参考另一篇文章。安装locate工具部分版本的 linux 系统使用 locate 快速查找某文件路径会报以下错误:-bash: locate: command not found其原因是没有安装

2021-07-16 00:54:16 491

原创 解决ERROR 1130: Host ‘x.x.x.x‘ is not allowed to connect to this MariaDB server 问题

问题描述在使用 SQLyog 操作 Linux 上的 MariaDB 时候,会出现如下错误:解决方法改表法可能是你的帐号不允许从远程登陆,只能在 localhost。这个时候只要在 localhost 的那台电脑,登入 mysql 后,更改 mysql 数据库里的 user 表里的 host 项,从 localhost 改称 %具体操作为:连接mysql服务器:mysql -u root -p看当前所有数据库:show databases;进入mysql数据库:use mysql;查看

2021-07-16 00:42:38 379

转载 CentOS7下MariaDB安装及配置

前言MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius主导开发,MariaDB名称来自Michael Widenius的女儿Maria的名字Linux安装MariaDB安装使用yum安装MariaDByum install mar

2021-07-16 00:35:04 3120

原创 CentOS7中卸载Firefox

在新装的 CentOS 系统中,自带了 Firefox 浏览器,虽然已经很不错了,但是并不是每个人都习惯用 Firefox,我们希望装其他浏览器使用,并卸载 Firefox ,下面介绍卸载的方法:首先先进入管理员模式执行:yum remove firefox然后用 whereis 查看,却发现还是有:[root@localhost ~]# whereis firefoxfirefox: /usr/lib64/firefox再执行:cd /usr/lib64/rm -rf firefox

2021-07-16 00:15:12 1279

原创 CentOS7安装Chrome

使用命令下载 rpm 安装包:wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm下载包名为 google-chrome-stable_current_x86_64.rpm 使用 root 权限进行安装:rpm -ivh google-chrome-stable_current_x86_64.rpm安装中报错:/usr/bin/lsb_release 被 google-chrome-sta

2021-07-15 23:10:51 169

原创 使用LxRunOffline工具备份/还原WSL

WSL 是 Windows 下的一个 Linux 子系统,可以直接在 Windows 上运行 Linux 环境,如执行一些编译等操作,无须使用实体机安装或者虚拟机安装。但是我们配置好的环境希望可以备份下来,如果环境出现了问题,我们可以直接还原。问题在于,Win10 1903 之前的版本没有自带 WSL 备份还原工具,我们需要借助第三方工具 LxRunOffline 来进行操作,但如果你系统是 1903 之后的,可以直接参考这篇文章即可。安装WSL开启WSL组件首先需要打开WSL组件,可以使用以下命令:

2021-07-15 23:00:54 841

原创 WSL中配置C/C++开发环境

很多时候,我们都需要一个 Linux 环境,但是装虚拟机又比较麻烦,自从微软为 Win10内置了 WSL(Linux 子系统)后,我们一般的需求可以代替实体装 Linux 或者虚拟机,再也不用折腾装系统复杂的切换了,而且 WSL 与 VSCode 配合写代码也是一绝,这篇文章将介绍在新安装的 WSL 中搭建基本的 C/C++ 开发环境常用的软件。更改国内源参考:https://www.cnblogs.com/zqifa/p/12910989.html第一步:备份源文件:sudo cp /etc/ap

2021-07-15 22:45:09 3204

转载 WSL备份与还原(使用Win10自带工具)

WSL备份与还原转载:https://www.jianshu.com/p/8b4ec8fafdca首先系统必须是 Win10 1903 之后的版本才能用这些命令。之前的不可以,请使用 LxRunOffline 工具备份还原。通过按 Win +R,输入 cmd 回车打开命令行窗口输入 wsl -l ,可以看到系统里装了一个 WSL 是 Ubuntu-20.04。> wsl -lWindows Subsystem for Linux Distributions:Ubuntu-20.04 (De

2021-07-15 21:37:09 10415 1

转载 解决Ubuntu中sudo报错:xxx is not in the sudoers file.

转载原文:http://www.linuxidc.com/Linux/2016-07/133066.htm新安装的 Ubuntu 在普通用户下用 sudo 执行命令时报:“xxx is not in the sudoers file.This incident will be reported” 错误。解决方法就是在 /etc/sudoers 文件里给该用户添加权限。如下:1、切换到 root 用户下。2、因为 /etc/sudoers 文件默认是只读的,对 root 来说也是,因此需先添 sudo

2021-07-15 21:26:03 2098

原创 VSCode配置Remote-SSH连接Linux远程开发

VSCode 作为最强的的一款编辑器,其强大之处在于其友好的操作界面和丰富的插件,除了为各种编程语言增加了插件外,对于 SSH 远程连接和 WSL 等都也有对应的插件,极大的方便了使用 VSCode,同时也能最大限度地利用 VSCode 强大的功能。本篇主要介绍的是使用 ssh 插件 Remode-SSH 进行远程连接 Linux 进行开发。安装Remote-SSH插件并配置注意:请确保你的 Linux 已安装 SSH 服务,否则请先在 Linux 上安装 OpenSSH-Server,这里不赘述其安装

2021-07-15 21:16:41 3928

转载 C++编译优化RVO&NRVO&复制省略

转载原文:https://www.cnblogs.com/kekec/p/11303391.html编译器优化技术现代编译器缺省会使用 RVO(return value optimization,返回值优化)、NRVO(named return value optimization、命名返回值优化)和复制省略(Copy elision)技术,来减少拷贝次数来提升代码的运行效率。注1:vc6、vs 没有提供编译选项来关闭该优化,无论是 debug 还是 release 都会进行 RVO 和复制省略优化

2021-07-15 00:33:22 268

原创 C的随机数函数

rand 和 srand 函数在 C 语言中使用 rand 函数产生一个随机数函数。并在 stdlib.h 中定义 rand 产生的随机数最大是 RAND_MAX,在 4 个字节下,可以表示的最大正数范围是 2147483647(int 类型)。rand 函数的原型如下:#includ <stdlib.h>int rand (void)rand 函数在调用时,先查询是否调用过 srand 函数,因为使用 srand 函数可以设置种子,如果有那么它会自动调用 srand(seed) 一

2021-07-15 00:33:06 4526

原创 C的时间操作相关函数

UNIX 时间概念在 UNIX 系统中,将从 1970 年 1 月 1 日开始经过的秒数用一个整数存放,这种高效简洁的时间表示方法被称为 Unix 时间戳,向左和向右偏移都可以得到更早或者更后的时间。实际开发中,对日期和时间的操作非常多,基本无处不在。时间的概念:本地时间(locale time)本地时间是在纪元时间(UTC)时间上加上时区。格林威治时间(Greenwich Mean Time GMT)世界时是最早的时间标准。在1884年,国际上将 1s 确定为全年内每日平均长度的 1/

2021-07-15 00:32:39 1233

原创 布隆过滤器(Bloom Filter)的原理和应用

布隆过滤器的概念布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一

2021-07-14 00:46:05 521

原创 Base64原理和实现

Base64 概念Base64已经成为网络上常见的传输8bit字节的编码方式之一。一般在做数据的传输时,系统之间的报文交互都需要使用Base64对明文进行编码,然后再进行加密,最后才传输。那么Base64的作用是什么?在数据传输时经常遇到一类情况:使用全ASCII英文字母没问题,但是涉及中文就会乱码,或者网络传输的字符并不完全时可打印的字符,如二进制文件、图片等。Base64就是为了解决此问题,它是基于64个可打印的字符来表示二进制的数据的一种方法。电子邮件刚问世时,只能传输英文,但后来随着用户增加,

2021-07-14 00:43:51 320

原创 UDP并发服务器思路

UDP并发与TCP并发的区别在TCP并发编程中,通常使用one loop per thread的并发模型,也就是使用多个线程,每个线程中都有一个epoll loop,无论是使用epoll还是poll或select,在观察有无数据就绪时,都是针对多个文件描述符。如果只有一个文件描述符,那么进程只要观察那一个文件描述符即可。网络编程中,一个Socket对应一个文件描述符。在TCP的并发中,服务器在监听端口初始化一个socket套接字描述符,接受客户端后就与每个客户端的连接有一个不同的文件描述符,所以TCP并

2021-07-14 00:39:06 3209 1

转载 C++11 tuple元组

tuple元组tuple是一个元组容器,可以用于函数返回多个值tuple的两种初始化方式:tuple<int, int> t1(1, 2);tuple<int, int> t2{1, 2};make_tuple用于生成tuple对象,和pair和make_pire类似:auto t3 = make_tuple(1, 2);tuple的成员数量没有限制访问成员使用一个get的标准库函数模板,为了指定一个显示模板,必须指定想要访问的第几个成员。tuple<st

2021-07-14 00:35:13 188

转载 C++11 function函数对象

C++函数种类C++中的函数种类很多:函数函数指针Lambda函数bind创建的对象仿函数(重载了函数调用运算符的类)但这些函数可能共享一种调用方式。调用形式指明了调用返回的类型以及传递给调用的实参类型。比如:int(int, int);使用functionstd::function是一个通用的多态函数包装器,可以调用普通函数、Lambda函数、仿函数、bind对象、类的成员函数和指向数据成员的指针,function定义在名为function.h头文件中。是一个模板,在创建functi

2021-07-14 00:33:51 430

转载 C++11 bind函数

参考:《C++ Primer 第五版》参数绑定如果一个函数只在一两个地方操作,使用Lambad很方便,如果在很多地方操作,编写多次相同的Lambda函数就很不方便,需要定义函数。但是,定义的函数又不能完全代替能捕捉局部变量的Lambda函数,所以就出现了bind函数。bind函数是C++11标准库的函数,需要添加头文件#include <functional.h>bind就是一个通用的函数适配器,它可以接受一个可调用函数,生成一个新的可调用对象来“适应”原函数的参数列表。std::

2021-07-14 00:30:46 199

转载 CMake教程及使用案例

转载:https://www.hahack.com/codes/cmake为什么需要CMake如果你一直在windows平台上开发,使用最多的可能就是VS的开发环境,它已经集成了全套的开发环境包括构建编译等。你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须

2021-07-14 00:27:34 611

转载 CMake命令和重要指令

CMake 命令分类CMake命令主要分为以下四种:脚本命令(始终可用)项目命令(仅在CMake项目中可用)CTest命令(仅在CTest脚本中可用)不推荐使用的命令(已弃用,仅可用于维护向后兼容性。每个命令的文档都声明了不推荐使用的CMake版本。不要在新代码中使用这些命令)脚本命令breakcmake_host_system_informationcmake_languagecmake_minimum_requiredcmake_parse_argumentscmake_p

2021-07-14 00:25:24 562

原创 volatile关键字详解

说到volatile关键字,首先需要从编译器优化开始说起。1. 编译器优化我们知道内存的访问速度是比不上CPU的处理速度的,为了提高性能,一般可以做出以下面两方面优化:硬件方面:引入高速缓存Cache,加速对内存的访问。另外现代CPU指令执行不一定严格按照顺序执行,没有相关性的执行可以乱执行,以充分利用CPU的指令流水线,提高执行速度。软件级的优化:一种是由编写代码的程序员优化,另一种是由编译器进行优化。编译器优化方法有:将内存变量缓存到寄存器中。由于访问寄存器比访问内存快得多,编译器在存

2021-07-14 00:22:22 159

原创 gcc编译选项及动/静态库

1. 编译过程预处理 (加 -E 选项生成 .i 文件)-E 选项指示编译器仅对输入文件进行预处理,预处理文件的拓展名是 .i 。g++ -E test.cpp -o test.i编译 (加 -S 选项生成 .s文件)-S 选项告诉编译器在为 C++ 代码产生了汇编语言文件后停止编译,g++ 产生的汇编语言文件的缺省扩展名是 .s 。g++ -S test.i -o test.s汇编 (加 -c 选项生成 .o 文件)-c 选项告诉编译器仅把源代码编译为机器语言的目标代码,缺

2021-07-13 13:15:04 1567

空空如也

空空如也

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

TA关注的人

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