自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 全网首发!!C++20新特性全在这一张图里了

前面我写了C++11、C++14、C++17新特性系列文章,大家可以移步到这里↓↓↓《C++11新特性,所有知识点都在这了!》《C++14新特性的所有知识点全在这儿啦!》《他来了,他来了,C++17新特性精华都在这了》没错,就差C++20新特性了,今天终于出炉啦。目录语言特性比较运算<=>对于 (a <=> b),如果a > b ,则运算结果>0,如果a < b,则运算结果<0,如果a==b,则运算结果等于0,注意.

2021-04-11 19:25:44 1404

原创 c++11新特性,所有知识点都在这了!

这篇文章基本上涵盖了c++11的所有新特性,并有详细代码介绍其用法,对关键知识点做了深入分析,对重要的知识点我单独写了相关文章并附上了相关链接,我还准备了完整版c++新特性脑图,有需要可以去我的gz号回复 “新特性” 下载,见文章最后。auto & decltype关于C++11新特性,最先提到的肯定是类型推导,C++11引入了auto和decltype关键字,使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。 auto:让编译器在编译器就推导出变量的类型,

2020-05-11 20:27:49 1002

原创 用了半年chromium,说说心得

第一次接触chromium,聊聊使用心得

2022-08-23 21:43:05 1683 1

原创 手撸一个智能指针

估计大家面试过程中应该都会被问到C++11的shared_ptr是如何实现的,大家应该都能答出来引用计数的概念,但是如果要让你手写一个shared_ptr,你能写出来吗?最近,我写了一个简单的shared_ptr,在这里分享一波。class SharedCount { public: SharedCount() : count_{1} {} void add() { ++count_; } void minus() { --count_; } int..

2022-04-23 20:30:00 663 2

原创 压箱底的音视频学习资料以及面经整理

本文原文包含链接较多,这边发不了,想看完整版的可以关注我的公众号:程序喵大人,搜本文标题大家好,我是程序喵。本人是主要从事音视频相关的开发工作,但发现网上关于音视频的学习资料都比较零散,而且也没有一套比较全面的面经,所以我把自己这几年整理的相关资料都掏出来给大家。(获取完整版pdf文档请在公众号后台回复“微信”,添加我微信领取)咳咳:这篇文章我本来都想开付费阅读了,因为真的耗费了我极大精力。后来想想还是算了,支持的就点个赞、转发、在看吧。废话不多数,直接上干货,内容都是自己整理的,有些地

2022-04-21 22:00:00 594

原创 C++的全链路追踪方案(稍微有点高端)

背景:本人主要在做C++ SDK的开发,需要给到业务端去集成,在集成的过程中可能会出现某些功能性bug,即没有得到想要的结果。那怎么调试?分析:这种问题其实调试起来稍微有点困难,它不像crash,当发生crash时还能拿到堆栈信息去分析,然而功能性bug没有crash,也就没法捕捉对应到当时的堆栈信息。因为不是在本地,也没法用编译器debug。那思路就剩log了,一种方式是考虑在SDK内部的关键路径下打印详细的log,当出现问题时拿到log去分析。然而总有漏的时候,谁能保证log一定打的很全面,很有可能

2022-04-19 19:30:00 949 1

原创 喵哥吐血整理:软件开发的51条建议

最近在读《软件开发的201个原则》,书内容不多,但是每一页都看的很仔细,好像往往这种言简意赅的书更让人有静下心来仔细阅读的欲望。在我看来,读书的作用本来就不是解答所有的困惑,而是激发人更加深入地学习的动力。如果看这本书的时候,你会主动搜索文献或者资料,去了解更多的信息,那说明这本书就已经帮助了你。话不多说,抛砖引玉,今天和大家分享下我的“读后感”。 质量第一:编程一定要把质量放在首位,没有可商量的余地。当你被要求要为质量做妥协时,要直接说不。质量必须可量化。 做好质量与开

2022-04-17 22:07:32 1747

原创 模版定义一定要写在头文件中吗?

大家在使用C++代码时或多或少都会使用到模板,使用模板时应该都是把定义放在了头文件中,因为放在源文件中定义会编译失败。那问题来了,模板中的函数定义一定要写在头文件中吗?先说结论:不一定要放在头文件中,定义也可以放在源文件中,但操作起来还是有点麻烦的。继续往下看看先看一段正常的模板代码:// template.h#include <iostream>template <typename T>struct TemplateTest { T value

2022-04-09 10:00:00 1764 2

原创 研究了一波RTTI,再介绍软件开发的201个原则

最近研究了一波RTTI,整理了一下知识点,在这里分享一下,下面是目录:RTTI 是 Run Time Type Information 的缩写,从字面上来理解就是运行时期的类型信息,它的主要作用就是动态判断运行时期的类型。一般在dynamic_cast和typeid中用到,例如父类B的指针转换子类A的指针,dynamic_cast会判断B究竟是不是A的父类,如果不是,会返回nullptr,相对于强转会更加安全。依据什么判断的呢?就是RTTI。先看下面这段代

2022-04-07 09:30:00 491

原创 介绍一个C++中非常有用的设计模式

大家好,今天介绍一个C++中非常常用的模式:pimpl至于它有什么作用,直接看代码:// MyClass.hclass MyClass {public: void func1(); void func2();private: void func3(); void func4(); int a; int b;};假设我们在开发一个SDK,或者设计某个模块,需要暴露出去一个MyClass.h头文件,并向用户提供func1和func2两个

2022-04-06 20:30:00 376

原创 为什么空类大小是1

我们可能都知道,C++中空类的大小是1。#include <iostream>class EmptyA {};int main() { std::cout << "sizeof EmptyA " << sizeof(EmptyA) << std::endl; return 0;};结果如下:sizeof EmptyA 1然而在C语言中空结构体的大小是0,空结构体大小是0我们貌似可以理解,但为什么到C++中,空类的

2022-04-04 10:00:00 1164

原创 推荐一个学习技术的好网站

最近发现了一个学习技术的好网站,网站链接是https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/,可点击阅读原文。具体内容如图:让我决定推荐给大家的理由就是CPU MESI协议的动画,一个多月前我看见这个网站的时候还只有CPU Cache相关的动画,今天一看发现居然这么快补上了排序和树的动画,排序和树操作比较简单,估计大家看什么网站都能理解(这个https://www.cs.usfca.edu/~galles/visualization/Algorithms.

2022-04-03 21:09:42 188

原创 C++20新特性的小细节

之前我整理过一篇C++20新特性的文章全网首发!!C++20新特性全在这一张图里了,里面提到过latch、barrier和semaphore,但是没有详细介绍过三者的作用和区别,这里详细介绍下。latch这个可能大多数人都有所了解,这就是我们经常会用到的CountDownLatch。用于使一个线程先阻塞,等待其他线程完成各自的工作后再继续执行。CountDownLatch是通过计数器实现,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所

2022-03-27 11:00:00 243

原创 分享一个编程设计小技巧(没有两三年工作经验估计看不懂)

直奔主题。假设有这样的一个需求,要给Animal类添加一个方法,如果一种动物可以吃掉另一种动物,则返回true,否则返回false。接口可能会是下面这样:struct Animal { virtual bool eat(const Animal& animal) const = 0;};那怎么实现呢?肯定是多态,估计你能想到的第一种方法就是这样:基类Animal的每个派生类都实现eat方法,然后根据参数运行时类型返回适当的值。如何获取参数类型呢?需要使用typei

2022-03-25 22:00:00 147

原创 手撸一个对象池

今天文章的字数不多,主要是分享一下对象池的实现!什么是对象池?对象的池子,与线程池、内存池类似,减少频繁创建和销毁对象带来的成本(特别是消耗资源较大的对象),可用于实现对象的缓存和复用。这也算是一种设计模式。话不多说,直接上代码:#include <algorithm>#include <cassert>#include <cmath>#include <complex>#include <iostream>#i.

2022-03-23 19:30:00 290

原创 if-else和switch-case哪个效率更高?看这四张图

大家平时编码过程中肯定会有些疑问,if-else和switch-case都可用于条件判断,那这两种方式谁效率更高?这里从汇编角度和大家一起分析一下。我查看汇编代码使用的是https://godbolt.org/这个网站,这个网站相当好用,里面集成了几十种编译器,推荐给大家!首先看下switch-case,即下面这张图,左半部分是C代码,右半部分是对应的汇编代码,编译选项是O3,即我们在实际项目中经常使用的优化选项。从图中可以看到,switch-case生成的汇编代码是使用的表结构,根据cas

2022-03-22 22:00:00 958 1

原创 从未见过把内存玩的如此明白的文章(推荐大家都来看看)

最近由于工作原因需要调研一些内存监测方面的开源库,偶然间了解到了一个项目,叫iqiyi/xHook。以前只用过malloc的hook,看完这个库作者写的文档后,我才发现,原来所有的动态链接库符号都可以hook(其实以前做过类似的,但是没有作者玩的这么骚)。不想听我废话的朋友可以直接滑到最后,点击阅读原文看这个开源库的ReadMe。下面是我的啰嗦环节。。。这里主要介绍下我为什么推荐这个库?(不是广告,没收费,也不认识作者)如果看完这个库的ReadMe,我相信大家会对

2022-03-21 15:25:39 1008

原创 代码调试心得

相信大家对如何调试代码很感兴趣。我也很感兴趣,但是自己属实也不知道啥高端调试技巧,这里抛砖引玉一波,介绍下自己常用的代码调试手段,大家有更好的调试手段欢迎在留言区留言,不要私藏。如何定位crash问题?关于crash问题我一般都是先看crash的报错,再查看堆栈信息,基本70%的crash问题都可以通过查看堆栈信息来定位,剩下的我一般都是结合log或者调试工具一起看。有的时候crash不会稳定出现在某个地方,这种调试起来比较麻烦,一般都是某块内存出了问题,比如某个对象其实是构造在0x123456

2021-11-18 08:15:00 633 1

原创 普通的int main(){}没有写return 0;会怎么样?

经常在知乎上可以看到这个问题,于是尝试着回答了一下,没想到国内C++巨佬吴咏炜老师还给我点了个赞,让我相当激动,下面具体介绍下!结论可能大家看上面的图就知道了,没有加return 0;编译器会自动添加一个。那怎么证明呢?可以查看相应的汇编代码,查看汇编代码推荐使用godbolt.org网站,相当方便。如上图,输入C++代码,在右半部分会显示编译器编译后的汇编代码,通过查看高级语言背后的汇编指令我们可以更好的分析代码的性能。网站更强大的功能是它支持市面上几乎所有的编译器,而且各个版本都有。..

2021-11-17 08:00:00 11747

原创 高端知识点:折叠表达式(我也是第一次知道)

不知道大家以前了解折叠表达式不,这里介绍一下!我也是最近才知道这个知识点,在C++中通过折叠表达式可以更容易的在可变参数模板中处理可变参数。先看一下传统的使用递归方式来处理可变参数的代码:#include <iostream>void print(int i) { std::cout << i << " ";}void func() {}template<typename T1, typename... Tn>void f

2021-11-16 10:45:00 570

原创 如何设计结构体

之前我写过一篇《如何设计一个C++的类》,今天这里继续聊聊如何设计结构体,注意本文不介绍在C++中结构体和类具体有什么区别,本文所说的结构体是指只有数据字段不带任何函数的那种结构体。当创建结构体的实例时,结构体的数据成员会按其声明的顺序连续存储。然而,这个声明的顺序也是有学问的,顺序不同结构体的大小可能有很大差别,数据成员的访问性能也可能会有很大区别!这里涉及一个概念:内存对齐。关于内存对齐我之前写过一篇文章:《内存对齐》,这里不深入讨论,只是简单介绍一下。大多数编译器会对齐数据成员,会以四舍五

2021-11-15 08:00:00 774

原创 C++学习路线图

经常有一些小伙伴问我有没有C++学习路线的相关文章分享一下,对此我特意整理了一张C++学习路线图分享给大家!直接看图:高清图片,请添加程序喵微信获取图中我分了11个板块: C语言入门基础知识 C++基础 C++进阶 C++新特性 操作系统 编译链接 C++项目 推荐工具 编码规范 推荐网站 推荐书籍 具体如下:C语言入门基础知识使用C++不可避免的需要

2021-11-14 22:10:11 6377 1

原创 操作系统:进程和线程所有知识点

01 什么是进程?标准定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行程序的实例,包括程序计数器、寄存器和程序变量的当前值。简单来说进程就是一个程序的执行流程,内部保存程序运行所需的资源在操作系统中可以有多个进程在运行,可对于CPU来说,同一时刻,一个CPU只能运行一个进程,但在某一时间段内,CPU将这一时间段拆分成更短的时间片,CPU不停的在各个进程间游走,这就给人一种并行的错觉,像CPU可以同时运行多个进程一样,这就是伪并行。0...

2021-11-09 16:30:00 1117

原创 关于多线程的13点建议

平时开发过程中大家可能都接触过多线程开发,其实多线程还是有很多门道的,这里贴出我的一点点看法,抛砖引玉一波。1使用标准库中的并行算法:C++标准库中有大量算法,在C++17后,有60多个算法支持并行执行,可设置ExecutionPolicy策略。尽量使用这些并行算法,没必要自己写个多线程相关算法。2可更多使用C++11的std::thread,而不是pthread,推荐std::thread没啥别的性能方面的原因,只是因为使用起来很方便。●std::thread配合lambda表达式创...

2021-11-09 07:15:00 225

原创 关于C++多线程学习建议

近期看到有读者在公众号留言问有没有C++多线程的学习方法,我这里特意总结了下,希望能对大家有所帮助。目录 什么是多线程? 为什么使用多线程? 如何创建线程? joinable()? 多线程参数传递方式 锁 原子变量 条件变量 async 多线程周边 关于多线程的一些建议 什么是多线程?不介绍,基础知识,直接看维基百科:https://zh.wikipedia.org/wiki/%E

2021-11-08 12:45:00 313

原创 写出高效代码的12条建议

大家好,我是程序喵!今天和大家介绍一下能让C++代码更加高效的几个小技巧,话不多说,以下为本文目录: 参数传递方式:值传递还是引用传递 函数返回方式:按值返回还是按引用返回 使用移动语义 避免创建临时对象 了解返回值优化 考虑预分配内存 考虑内联 迭代 vs 递归 选择高效的算法 利用缓存 profiling other碎碎念 以下为正文:值传递还是引用传递一般情况

2021-11-08 07:30:00 310

原创 手撸一个对象池

今天文章的字数不多,主要是分享一下对象池的实现!什么是对象池?对象的池子,与线程池、内存池类似,减少频繁创建和销毁对象带来的成本(特别是消耗资源较大的对象),可用于实现对象的缓存和复用。这也算是一种设计模式。话不多说,直接上代码:#include <algorithm>#include <cassert>#include <cmath>#include <complex>#include <iostream>#inc

2021-11-07 16:12:25 148

原创 分享一个编程设计小技巧

直奔主题。假设有这样的一个需求,要给Animal类添加一个方法,如果一种动物可以吃掉另一种动物,则返回true,否则返回false。接口可能会是下面这样:struct Animal { virtual bool eat(const Animal& animal) const = 0;};那怎么实现呢?肯定是多态,估计你能想到的第一种方法就是这样:基类Animal的每个派生类都实现eat方法,然后根据参数运行时类型返回适当的值。如何获取参数类型呢?需要使用typei

2021-11-07 15:44:00 50

原创 如何阅读开源项目?

经常有小伙伴私信问我怎么阅读开源项目代码,许多人不知道从何处入手,没有方向感,就像学习一门语言总先要有个学习路线一样。这其实不是三两句话能说明白的,所以就有了这篇文章。相信每个人都有一套自己的策略,这里整理了下我平时阅读项目代码的六大步,希望可以对大家有所帮助。粗略看官方文档,明确项目都有什么主要功能,以及如何运行项目; 找到项目的入口,把项目运行起来; 找到主要功能对应的代码。挑一个主要功能进行调试,比如一个美妆项目,那可以挑一个口红颜色强度的功能进行调试,找到该功能的触发函数,再往深处找

2021-11-07 15:11:58 279

原创 C++中glog源码剖析以及如何设计一个高效 log模块

每个开发者编程中都会记录log信息,多数人都会使用log第三方库,log库使用起来很方便,但我们也需要了解log系统的原理,这里以glog为例进行分析。开始这里不会介绍glog中是如何控制INFO、ERROR等级别的输出的,其实就是一个宏控制,主要介绍google glog中一次LOG(INFO)过程中究竟发生了什么,以及为什么glog是线程安全的。glog中的LOG(INFO)其实是一个宏定义,如下:#define LOG(severity) COMPACT_GOOGLE_LOG_ ##

2021-11-07 15:10:49 1122 3

原创 new[]和delete[]一定要配对使用吗?

在平时资料中,我们常看到:new和delete,new[]和delete[]一定要配对使用!也有人说:有时候不配对使用也不会出现问题。也许你也是只知其然,不知其所以然,然而我也有点懵了_(¦3」∠)_那就研究下这个问题:首先,看下这段配对使用代码:#include <stdlib.h>#include <iostream>using namespace std;class inner { public: inner() { cout <

2021-11-07 14:51:17 576

原创 多线程学习指南

近期看到有读者在公众号留言问有没有C++多线程的学习方法,我这里特意总结了下,希望能对大家有所帮助。目录 什么是多线程? 为什么使用多线程? 如何创建线程? joinable()? 多线程参数传递方式 锁 原子变量 条件变量 async 多线程周边 关于多线程的一些建议 什么是多线程?不介绍,基础知识,直接看维基百科:https://zh.wikipedia.org/wiki/%E

2021-11-07 14:40:21 285

原创 分享一个编程设计小技巧

直奔主题。假设有这样的一个需求,要给Animal类添加一个方法,如果一种动物可以吃掉另一种动物,则返回true,否则返回false。接口可能会是下面这样:struct Animal { virtual bool eat(const Animal& animal) const = 0;};那怎么实现呢?肯定是多态,估计你能想到的第一种方法就是这样:基类Animal的每个派生类都实现eat方法,然后根据参数运行时类型返回适当的值。如何获取参数类型呢?需要使用typei

2021-10-20 17:02:58 70

原创 C++20新特性的小细节

之前我整理过一篇C++20新特性的文章全网首发!!C++20新特性全在这一张图里了,里面提到过latch、barrier和semaphore,但是没有详细介绍过三者的作用和区别,这里详细介绍下。latch这个可能大多数人都有所了解,这就是我们经常会用到的CountDownLatch。用于使一个线程先阻塞,等待其他线程完成各自的工作后再继续执行。CountDownLatch是通过计数器实现,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所

2021-10-20 16:51:22 258

原创 如何阅读开源项目代码?

经常有小伙伴私信问我怎么阅读开源项目代码,许多人不知道从何处入手,没有方向感,就像学习一门语言总先要有个学习路线一样。这其实不是三两句话能说明白的,所以就有了这篇文章。相信每个人都有一套自己的策略,这里整理了下我平时阅读项目代码的六大步,希望可以对大家有所帮助。粗略看官方文档,明确项目都有什么主要功能,以及如何运行项目; 找到项目的入口,把项目运行起来; 找到主要功能对应的代码。挑一个主要功能进行调试,比如一个美妆项目,那可以挑一个口红颜色强度的功能进行调试,找到该功能的触发函数,再往深处.

2021-10-20 16:10:24 619 2

原创 硬核文章:编译器都做了哪些优化?

这是优化系列第三专题文章,因为编译优化是成本收益比最高的优化手段,这篇文章主要介绍编译器是如何进行代码优化的,能做什么优化,不能做什么优化,如何充分利用好编译器的优化选项。现代编译器可以对代码进行大量修改,以提高性能。对于程序员来说,知道编译器能做什么和不能做什么是很有用的,程序员需要了解这些优化。函数内联编译器可以用被调用函数的函数体替换函数调用,例如:float square(float a) { return a * a;}float parabola(...

2021-04-11 19:03:50 937

原创 满屏的if-else,怎么消灭它们?

之前我曾经在知乎写过一篇回答,详细介绍了if-else的效率问题。过多的if-else不仅导致程序运行效率低下,而且导致代码圈复杂度过高。如果大家有使用过静态代码分析工具,就会知道圈复杂度是衡量代码质量的一项重要的指标,圈复杂度越高,代码出现bug的可能性也越大。我们可能刚开始写的代码很简洁,只有一个if-else分支,但由于需求的叠加和各种错误处理,我们有时候不得已要多加几个if-else,久而久之就发现,满屏的if-else,令你极其讨厌自己写的代码。至于如何消灭if-els..

2021-04-11 18:43:09 425

原创 include cpp?还可以这样?

前两天突然看见部门有个项目的代码里通篇全是#include "xxx.cpp",我表示从来没见过这种写法,引发了我的一些思考:问题一:这啥玩意?C++是一门高深莫测的语言,什么写法都有,而且#include本质上就是复制粘贴代码,我也不敢说别人写的不对,可能开发者是C++大佬,写了一些我们普通人无法理解的代码也是正常的。问题二:整个项目都是这种引用方式,不会导致某一函数重复定义吗?为此我查了一些资料,并做了一些测试:代码段1:// file1.cc#include..

2021-04-11 17:29:28 4063 3

原创 C++优化系列之代码效率真相第三篇

本篇文章我们将继续分析C++各种操作的效率,包括不同类型变量的存储效率,使用智能指针、循环、函数参数、虚函数、数组等的效率,以及如何做针对性优化,或选择更有效的替代方案。详细目录看下图:类和结构体现今流行面向对象编程,个人也认为这是一种使代码更加清晰和模块化的方法。面向对象编程风格优缺点明显,优点是: 如果变量是同一结构体或类的成员,则一起使用的变量也存储在一块,这样数据缓存更有效。 类成员变量不需要作为参数传递给类成员函数,省去了参数传递的开销。 缺...

2021-04-10 20:42:07 637

原创 C++优化系列之代码效率第二篇

本篇文章我们将继续分析C++各种操作的效率,包括不同类型变量的存储效率,使用智能指针、循环、函数参数、虚函数、数组等的效率,以及如何做针对性优化,或选择更有效的替代方案。详细目录看下图:数组数组很简单,就是多个元素连续的存储在内存中,但没有存储关于数组大小的信息,这样尽管在C++中使用数组比其它语言更快,但是它更不安全,所以我们可以使用带边界检查的数组,例如std::array,这样更安全一些,或者根据特殊需求自定义一个:template <typename ...

2021-04-10 20:36:22 656

空空如也

空空如也

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

TA关注的人

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