自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ 重载运算符的高端用法 operator Type() vs Type operator()

C++ 重载运算符operator 隐式转换 强转

2022-10-12 11:10:16 391 1

原创 protobuf3 import的使用和多proto代码生成和cmake中引用protobuf

介绍如何使用cmake去构建依赖protobuf3的C++工程,设计多proto的引入和代码生成

2022-09-08 22:24:51 1133 2

原创 C++项目如何使用CMakeLists.txt添加boost库

如何添加boost到由cmake构建的C++工程

2022-07-24 23:57:10 2387

原创 C++2.0 shared_ptr和weak_ptr深入刨析

刨析std::shared_ptr和std::weak_ptr原理

2022-02-26 19:55:52 820 3

原创 std::map 自定义类型为key,需重载小于运算符

虽然这个问题从学C++就知道,但最近面试的时候,面试官问如果map要使用自定义类型作为key行不行。我一想他肯定是要问我实现operator <的问题,然后我说了一个不一定哦~ 不必要哦~特此记录一下。一般来说当申明map对象的时候,需要传入支持绝对小于运算的类型作为key:#include <iostream>#include <map>struct Key { int a; int b; explicit Key(int x, int y) :

2022-02-20 14:25:38 2889

原创 epoll reactor反应堆服务器demo学习

采用默认高电平触发(水平触发)同步非阻塞I/O简单模仿陈硕的muduo,实现一个高吞吐的服务器模型框架使用多态代替muduo::net::Channel和std::bind接口提供异步定时器,接受任意类型调用对象,返回一个future已上传github作为学习使用 github_link//copyablility.hh 提供对象的拷贝权限#ifndef __COPYABILITY__#define __COPYABILITY__class copyable { protected:

2022-02-09 23:47:28 1135

原创 避免使用std::bind

对比一波不同函数调用时的速度#ifndef _HHH_#define _HHH_#include <chrono>#include <cstdio>namespace test {class Base { public: Base() = default; virtual ~Base() = default; virtual void Print() = 0;};class Derived : public Base { public:

2022-01-26 14:45:25 712

原创 g++ std标准库对std::string的实现分析

不同编译器对C++标准库的实现都有各自的逻辑和风格,对于字符串类型,gnu c++template<typename _CharT, typename _Traits, typename _Alloc>class basic_string { struct _Alloc_hider : allocator_type // TODO check __is_final { _Alloc_hider(pointer __dat, const _Alloc &__a)

2021-12-27 23:38:12 778 1

原创 C++11, 14, 17对tuple元素的访问方式

std::tuple 作为可以存放任意个数,任意类型的元祖被我个人经常使用。记得以前看侯捷谈到这个数据结构的时候,被他的实现所惊奇,太巧妙地设计。我自己在使用std::tuple的时候也随着C++版本的更新尝试新的写法,对于元组中元素的获取,我一直觉得很有意思:比如我有这么一个源文件:#include <iostream>#include <tuple>#define CPP11 (__cplusplus < 201401L)#define CPP14 (__cpl

2021-12-25 23:27:24 2451

原创 Java和C++通过JNI实现互相调用 安卓native实战案例

最近研究了一下JNI,JNI作为Java/Kotlin 同C/C++相互调用的桥梁,在安卓native开发中我感觉还是比较重要。本文简要介绍一下他们之间互相调用的流程和注意事项:借由Android Studio来开发比较简单: 可以在模板上选择native C++生成安卓工程如果哪里说得不对,想看到的真大佬能够指出,感激不尽!从晚上十点敲到晚上十一点半,也不容易~作为C++开发,在Java的代码规范上,和具体名词或者原理上存在知识上的不足,无视无视第一个例子是传字符串给native方法进行解析

2021-12-16 23:49:18 3727

原创 C++构造析构调用顺序分析

我记得我在学校的时候,以及当初看学习视频的时候,总是被告诉C++对象构造的顺序,先调用父类的构造函数,后按照顺序调用各成员的构造函数,最后再调用当前类型的构造函数。反过来析构的时候,先调用当前类型析构函数,然后从下到上调用成员的析构函数,最后调用父类。当初乍一听,并且在每个类的构造器和析构器中加打印,感觉老师说的没有问题!但是我当时有一个疑问,C++编译器是如何控制这一套流程的呢?后来我发现老师说的并非全对。看下面的例子:普通构造,析构分析, 零优化的汇编代码,栈上创建对象的情况#include

2021-12-10 21:52:29 505

原创 C++ 简单线程池

今天看了github上点击量最大的一个C++2.0实现的线程池:链接,感觉看起来很简单明了于是看后自己默写了一个线程池类,并对里面步骤进行注释,也是提升我自己的一部分tips:原代码中的std::result_of在C++17的类型萃取库中已经移除,因此我改用指代更为清晰的decltype进行修改。具体代码如下,代码风格采用谷歌式:#pragma once#include <atomic>#include <condition_variable>#include &l

2021-11-22 21:47:10 473

原创 C++设计模式:模板方法模式

模板方法模式:通过晚绑定来实现松耦合动机在软件构建过程中,对于一个任务,常常有稳定不变的整体结构和流程,但其中某些子步骤存在多变的需求,或者在设计整体结构时,子步骤无法和整体结构同时实现。比如程序库设计人员提供了MediaProcess类,用于对媒体码流解复用,和复用class MediaProcess{public: void demux() { // 分离音视频 } void mux() { // 合并音视频 }}

2021-11-20 20:50:10 241

原创 Linux vim使用方式学习纪要

vim学习在Linux下工作和学习,离不开vi和vim的使用,巧妙记住各种模式下的各种指令,不仅可以在工作中大大提高效率,还能装一个满分的哔我比较菜,只会下面最常用的4种模式中的部分组合技能 (-。- 不过好像在我的开发工作中已经完全足够了。。。模式:普通模式编辑模式命令模式可视模式普通模式光标移动h, j, k, l:←, ↓, ↑, →数字 + 方向实现连续动作:3j:向下跳3行,8l:向右跳8列b begin的意思,跳到这个单词的前面w world的意思,跳

2021-11-20 20:45:02 580

原创 ubuntu20.0.4 安装zsh纪要

Z shell(Zsh)是一款可用作交互式登录的shell及脚本编写的命令解释器。Zsh对Bourne shell做出了大量改进,同时加入了Bash、ksh及tcsh的某些功能。自2019年起,macOS的默认Shell已从Bash改为Zsh。于是我要在我的ubuntu设备上安装zsh来增加我的愉悦值首先下载zsh,也可以使用aptitude替代apt$ sudo apt install zsh查看是否安装成功了,打印版本号就ok$ zsh --versionzsh 5.8 (x86_64-

2021-11-19 23:53:25 2067

原创 C++设计模式:工厂模式

动机:在策略模式(链接:策略模式)中,作为行为型设计模式,它根据外部传入实际对象来实现解耦和复用实际对象的产生就引入了一种创建型设计模式 – 工厂方法模式所谓创建型模式,就是避免在代码中对象创建(new)过程所导致的紧耦合(以来具体类),从而在对象创建的代码中实现结构的稳定。分析改造前的代码:class Dianping { public: void review() { Food *food = new ChinaFood; // ChinaFood是具体依赖类 Revie

2021-11-13 21:00:56 728

原创 C++ 虚函数 虚析构 多态性原理

C++ 动态绑定:C++ 动态绑定触发时机:基类中有虚函数使用基类类型指针引用子类对象基类指针调用虚函数#include <cstdio>class Base { public: virtual ~Base() {} virtual void foo() { ::printf("%s", __PRETTY_FUNCTION__); } virtual void foo1() { ::printf("%s", __PRETTY_FUNCTION__); }

2021-11-13 20:57:42 553

原创 C++设计模式:策略模式

策略模式:符合开闭原则,如果if else过多或者有待增加时宜使用,节省高级缓存指令空间占用行为型设计模式,不同的创建型对象的具体行为分析重构前的代码:class Review { public: enum FoodType { CHINA, JAPAN }; public: void isYummy() { if (type_ == FoodType::CHINA) ::printf("好吃\n"); else if (type_ == FoodType::

2021-11-13 20:54:38 328

原创 C++设计模式:单例模式

单例模式的使用相当广泛,当一个类只允许被构造一个对象的时候尤为常见禁止外面直接调用构造器禁止被拷贝和移动// 从设计上禁止行为MyClass a;MyClass *p = new MyClass;MyClass b(a);MyClass c(std::move(a));c++中如果不想因为调用某个函数而产生某种效果,那么你就不应该声明这个函数,但是这个存在5个例外,五大函数如果你不定义它,编译器会默认生成空函数体的五大函数,已完成C++自己的内存管理机制。 MyClass() {}

2021-11-13 20:47:28 832

原创 vs2019安装boost库

太久没整windows 感觉差点不会了boost下载地址如果平台工具集是Visual Studio 2019 那么你最好选择最新的boost版本,会向下兼容,比如我下的boost_1_77_0下载后解压,来到解压(我的路径比如说:D:\CodeMgr\boost_1_77_0)目录,打开cmd执行命令行D:\CodeMgr\boost_1_77_0>bootstrap.bat执行后会生成b2.exe bjam.exe可以看看b2这个程序支持接收那些参数和可选项D:\CodeMgr\

2021-10-22 16:00:11 612

原创 c++11 耗时计算 微秒级

#include <chrono>#include <iostream>class MillTimeCast final { public: MillTimeCast() : record{std::chrono::system_clock::now()} { std::cout << "Start!\n"; } ~MillTimeCast() { auto now = std::chrono::system_clock:

2021-10-15 10:23:09 505

原创 C++ override 虚析构函数 使用技巧

#include <cstdio>class Base {public: ~Base() { ::printf("base\n"); }};class Derived : public Base {public: ~Derived() { ::printf("derived\n"); }};Base *ptr = new Derived;delete ptr;众所周知,上例会造成内存泄漏,子类中的数据成员没法得到释放,最重要的是这种行为并不会被编译器察

2021-10-13 20:21:57 4279

原创 C++2.0 右值引用、移动语义、完美转发 自认为详解

# C++2.0 右值引用、移动语义、完美转发抛开以前听过左值和右值的一切传说,投入到我的主观分析里面,看完再做思考,不足或者错误之处,欢迎随时指出!1. 左值左值有自己的名字,不管是真名还是别名。能够使用使用**&或者std::addressof(…)取得地址,左值既能放在=**操作符左边也能在其右边tips: 常见左值有:函数名 [当我们将函数名作为一个值来使用时,该函数名自动转换为指向对应函数的指针] 和具名变量,具名变量如std::cin、std::endl等返回左值引用的函数

2021-09-24 20:42:55 204

原创 C++11 多线程模块封装

C++11 多线程模块封装在实现一个通知的时候上网找资料,发现这位大佬的实现跟我极其相似,草哈哈哈哈当然线程模块还有很多实现方式比如在Task中定义线程入口函数,外部去注册函数,然后运行。也可以是不让Task成为抽象类,可以作为外面功能模块的成员,接收外面功能模块的函数注册,然后运行,都可以。不多说了,直接上代码task.hpp#pragma once#include <atomic>#include <memory>#include <mutex&g

2021-09-02 17:43:29 1059

原创 ubuntu the system is running in low-graphics mode 解决办法和恢复全屏且流畅

Ubuntu系统启动报错:The system is running in low-graphics mode选项“默认”选择之后 Ctrl+Alt+F1 进入系统,随后输入密码进入用户在命令行中依次输入:cd /etc/X11sudo cp xorg.conf.failsafe xorg.confsudo reboot这样可以重新进入ubuntu了重启后图形界面会处于低画质模式,且相当卡顿,只需要依次输入sudo apt-get updatesudo apt-get upgrades

2021-07-27 10:40:13 902

原创 Ubuntu16.04 安装 Docker

su - root移除可能存在的旧版本docker:apt-get remove docker docker-engine docker.io containerd runc也可以使用国内 daocloud 一键安装命令:curl -sSL https://get.daocloud.io/docker | shapt-get update安装 apt 依赖包,用于通过HTTPS来获取仓库:apt-get install \ apt-transport-https \ c

2021-07-22 11:24:49 221 1

原创 cmake 构建linux工程学习记录

以前在Linux上通过一套格式化的Makefile来构建Linux工程,生成库和可执行文件。今天看了一下cmake这种跨平台构建方式来构建Linux下工程一样方便,可值钱格式化的Makefile没有什么不一样。下面进行展示:我在虚拟机中的工作目录如图所示:本文首先在prj_lib工程中生成动态库,然后再在prj_linux中生成目标程序时链接该动态库,这样比较符合日常实际开发。放心这里的实例不会比别人从单文件到多文件再到链接库来得困难。生成动态库:进入到prj_lib的目录下,有3个文件夹和一

2021-06-20 20:14:56 314

原创 C++17 string_view 详细案例

C++17 使用std::string_view来观测一段字符数组,减少内存的拷贝,或者说不至于像string对象通过移动后,前一个对象放弃那快本属于它的内存。// 原码:// TYPEDEFS FOR basic_string_viewusing string_view = basic_string_view<char>;// CLASS TEMPLATE basic_string_viewtemplate <class _Elem, class _Traits>cl

2021-05-21 08:39:11 1470

原创 C++11 成员函数作为回调函数使用示例

前言std::bind()被广泛地应用在新式的回调函数中。C++11以前类的普通成员函数不能作为回调函数去注册,因为将普通成员函数注册给对方,但对方使用这个函数指针时,就会发生参数列表匹配的问题,因为少了隐含的this。静态成员函数不包含this指针,所以一般将静态成员函数注册给对方。C++11推出std::bind()和std::function搭配,前者生成新的调用对象,参数个数可以小于绑定函数的参数个数,少的参数,按位占用。后者保存函数调用类型的函数对象,使用该对象进行设置参数即可。示例1

2021-04-14 23:27:53 2782

原创 从汇编和编译器角度分析C++得this指针和成员函数寻址

(鄙人总结,希望和大家交流,切莫转载,谢谢!)引入先看一段这个代码:#include <cstdio>class Moo { public: void Printf(int a) { ::printf("%p, %d\n", this, a); }};int main() { Moo *p = nullptr; p->Printf(1); p = new Moo; p->Printf(1); delete p;}执行结果是:(nil

2021-04-07 23:00:10 512

原创 protobuf3 ubuntu20安装和验证

前序公司的protobuf相关文件实在windows下生成的,本文是个人想学习Linux下如何生成相关文件,把自己安装步骤和简单实用做一下记录。我基于ubuntu 20.04.1虚拟机,g++ 9.3.0来讲解。1. 请确保你的编译器支持c++11及其以上,尽量支持c++14。2. 下文在涉及编译器版本编写特定代码处会加以说明。protobuf3简介简介引用这位博主的文章。步骤下载及安装本次我先从github中下载cpp版本的源代码的protobuf-cpp-version.tar.gz/

2021-03-21 22:13:04 1548 1

空空如也

空空如也

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

TA关注的人

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