![](https://img-blog.csdnimg.cn/20190828155827963.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 92
AlbertS
一个手残党怀着对游戏的好奇心踏上了开发之路,旅途中磕磕绊绊踩了不少坑,触了不少雷,深知好记性不如烂笔头的道理,于是记录下学习路上的点点滴滴,努力在这个浮躁的年代做一个专注的人,携码起舞,与君共勉。
Coding是件有趣的事情,快乐的看待每一天,我真的非常幸福~
展开
-
git diff对比差异时指定或排除特定的文件和目录
你一般什么时候会用GPT?居然会有这种话题,答案就是作为程序员的我天天在用,虽然GPT有个胡说八道的毛病,但试试总没错的,就比如今天题目中这个问题,我也是先查了GPT没好使,但给我提供了查询思路,最后在Stack Overflow上找到解决办法,记录一下...原创 2023-10-31 21:26:41 · 2250 阅读 · 0 评论 -
C++20中的关键字
源于上一篇中提到了decltype是一个关键字,所以去查了现有的关键字列表,其实我对C/C++的关键字还停留在上世纪大概30多个的时代,虽然知道C++加了autoconstexpr等关键字,但查询过后才发现原来他扩充到了将近100个,而C语言的关键字也扩到了六七十个,有点震惊了...原创 2023-10-07 23:36:39 · 459 阅读 · 0 评论 -
C++中的decltype、std::declval 和 std::decay_t傻傻分不清楚
在C++中提到推导第一个映入脑海的可能是“模板”,当然有人也可能想到auto,这些都是和推导相关的语言语法,再比如“完美转发”等等,总是就是他们的类型不用明明白白的写出来,可以利用一种简单的方式来定义,比如candidates是一个字符串数组, 如果遍历它我们可以写成,而不用将skillId变量定义成,这在一定程度上带来了便利,今天的几个东东也是用于推导的,我们一起来看看...原创 2023-09-05 21:47:01 · 1440 阅读 · 0 评论 -
C++定义一个返回值为拥有3个元素的 char 数组引用的函数
编程语言最怕细节,怼着一个点扣能让你怀疑人生,今天就碰到这么一个问题,“C++定义一个返回值为拥有3个元素的 char 数组引用的函数”,不敢说99%的人不会,但我觉得应该有80%的人写不出来吧,要不你来试试...原创 2023-08-28 22:21:41 · 305 阅读 · 0 评论 -
C++编程中的六种内存顺序模型
程序员真是一个活到老学到老的职业,一天不学习就会掉队,『内存顺序模型』对于我来说就是一个新的世界,虽然之前写过多线程的服务器,也处理过死锁和竞态条件等问题,但是从来没考虑过内存顺序问题,所以当我第一次看到这个概念时,整个人都是懵的,经过一段时间的学习和了解有了初步的认识,所以简单总结下来,以备后续查看,不多写,慢慢总结...原创 2023-08-24 23:01:59 · 1458 阅读 · 0 评论 -
C++中的 i++ 和 ++i 这两种自增运算不是原子操作
C++中的i++和++i这两种自增运算是不是原子操作,突然被这么一问竟有点不知所措,这么“简单”的操作应该是原子的吧,但是好像有读又有写应该不是原子操作,原子操作就是那种刷一下就能完成的操作,准确来描述就是一个操作不可再分,要完成都完成不能存在中间态,咦?怎么听起来和事务这么像?那么i++和++i是不是原子操作我们看它是否满足不可再分就行了...原创 2023-07-04 09:58:39 · 303 阅读 · 0 评论 -
C++访问std::variant类型数据的几种方式
`std::variant`(可变体) 是 `C++17` 中引入的一个新的类模板,提供了一种存储不同类型的值的方式,类似于之前版本中的 `union`(联合体),但可以存储非 `POD` 类型和类对象,能够在运行时进行类型检查和转换,但具有更多的功能和更高的类型安全性,今天来看一下存储在`std::variant`中的数据要怎么读取...原创 2023-06-23 21:24:41 · 3494 阅读 · 0 评论 -
linux环境下使用daemon函数实现守护进程
daemon进程是后台守护进程,比如linux 下server都是daemon进程,像httpd、sshd等这些服务你肯定听说过,如果我们想写一个后台运行程序应该怎么做呢?其实非常容易,只要添加unistd.h头文件,然后在调用daemon函数即可...原创 2023-05-12 22:43:23 · 1742 阅读 · 2 评论 -
C++代码使用 gperftools 工具进行性能分析
一直想用gperftools做一下性能方面的尝试,之前一直忙着开发,目前已经到了后期,忙里抽闲亲自操作一遍,从安装到分析做个简单的记录,以便后续拿来直接用...原创 2023-04-19 23:28:00 · 984 阅读 · 0 评论 -
排序算法系列之(七)——分分合合的归并排序
再一次总结基础的排序算法,印象里距离上一次总结排序也没过多久,查询后才发现上一篇总结《排序算法系列之(六)——逐步砍掉树杈的堆排序》到现在已经过去了3年多的时间,真是时光荏苒,岁月如梭啊,这次想起总结排序起因并不是排序,而是查找逆序数对,而解决逆序数对通常使用的两种方式是归并排序和离散化树状数组,所以我又把归并排序捡起来了...原创 2022-10-04 02:24:57 · 825 阅读 · 0 评论 -
参考开源项目实现一个简易的C++枚举转字符串的函数
前段时间接触了 magic_enum 这个开源库,代码量不算太多,是一个但头文件的枚举操作库,关于如何使用还写了一篇总结 《推荐一个C++枚举转字符串的开源项目magic_enum》,当时觉得这个库很棒,但是对于我当前枚举转化字符串的需求还说还是太臃肿了,所以决定改造一下,这不今天过来填坑了...............原创 2022-08-07 17:39:57 · 3632 阅读 · 6 评论 -
std::uniform_real_distribution的一个bug引发的服务器崩溃
近日发生一次线上游戏服务器宕机问题,通过日志和core文件信息定位到崩溃的函数,但是崩溃的位置却是一段很长时间都没有改动过的代码,起初怀疑是配置数据的问题,但仔细查看之后均正常,然后又怀疑是玩家旧数据异常导致,但是分析代码逻辑后也没发现问题,最后是一个同事发现生成随机数的代码有bug,导致数组越界了,真是一个意想不到的问题............原创 2022-08-07 01:47:11 · 2661 阅读 · 0 评论 -
推荐一个C++枚举转字符串的开源项目magic_enum
C++11引入了强类型的枚举类 `enum class` 用来代替旧风格枚举`enum`,新引入的 `enum class` 具有诸多优点:防止命名空间污染,不能隐式的转换为整型,防止不同类型的枚举相互赋值,支持前置声明。当然它也不是只有优点,因为类型不能隐式转换成int,所以在使用或者输出时需要使用 `static_cast` 进行转换,不过即便使用 `static_cast` 可以转换后输出,也不便于我们辨识枚举的值,如果想输出枚举定义时的名字就需要使用一些魔法了......原创 2022-07-24 02:42:09 · 3265 阅读 · 2 评论 -
C++17使用std::optional表示一个可能存在的值
平时写代码会遇到一种传递参数`特殊值`标记特殊流程,或者函数返回值存在魔法数的情况,很需要一种标记参数或返回值状态的结构,那么在 C++17 标准下提供了 `std::optional` 这个模板类,可以表示一个值不存在的状态,一起来看看用法吧.........原创 2022-07-17 23:35:10 · 1142 阅读 · 5 评论 -
偶然在github开源项目中发现了.travis.yml这货
偶然在一个github开源项目中发现了.travis.yml这货,然后一发不可收拾,翻了翻之前看的几个开源库都有这个文件,并且最近经常看到它,这被称为“巴德尔-迈因霍夫现象”,是一种认知偏见,即在第一次注意到某一事物后,有一种更频繁地注意到它的倾向,导致某人相信它有很高的频率,既然这样索性就深入研究了一下这个文件,发现它原来是用于持续集成的...............原创 2022-07-03 10:33:03 · 6503 阅读 · 2 评论 -
C++11中的noexcept说明符和操作符
`noexcept` 这个说明符看起来很厉害的样子,给人一种函数加上它就可以不产生异常的感觉,但事实真的如此吗?它真的能消除一切异常吗?答案是不能!它只是函数的一种说明,作为开发者我们需要自己保证标记了 `noexcept` 的函数不产生异常。啥?这不是没事找事吗?.........原创 2022-06-26 17:31:53 · 1568 阅读 · 6 评论 -
C++17新语法之if和switch语句中可以初始化变量啦
今天在看一些c++代码时偶然间发现一些示例,在if语句的小括号内居然出现了分号,难道这一段是伪代码吗?之前从来没见过这种写法,然后用写了一个例子,用最新的编译器编译后发现真的是正常的代码,并且可以成功运行,然后脑袋有个声音一闪而过,是不是一直就支持这种写法,只是我不知道而已,后来几经周折,终于发现真相,原来这其实是C++17新的语法......原创 2022-06-19 01:54:32 · 1661 阅读 · 0 评论 -
C++11新式洗牌std::shuffle与老式洗牌函数std::random_shuffle的区别
洗牌算法是项目开发中常用的一种算法,它和随机数有着密不可分的关系,比如我们从报名参与活动的前10个用户中选取一个人发放幸运奖,这时可以从[1, 10] 范围内随机一个数来确定幸运儿;如果是抽取两个人呢?那就随机两次!是的,确实可以这样做,但是随着随机次数的增多,后面随机的数字很可能和前面一样,这时就要重复随机才能解决...原创 2022-05-03 21:52:07 · 6412 阅读 · 6 评论 -
恶搞一下std::forward函数
关于 `std::forward` 的用法在之前的文章 《C++11中std::move和std::forward到底干了啥》已经总结过了,它被称为完美转发函数,用于函数模板中完成参数转发任务,当形参为左值引用时把它转发成左值,而在形参成为右值引用时把它转发成右值,依靠了引用折叠规则和 `std::remove_reference` 模板...原创 2022-05-01 23:05:28 · 1029 阅读 · 0 评论 -
C++可变参数模板的展开方式
可变参数模板(variadic templates)是C++11新增的强大的特性之一,它对模板参数进行了高度泛化,能表示0到任意个数、任意类型的参数。相比C++98/03这些类模版和函数模版中只能含固定数量模版参数的“老古董”,可变模版参数无疑是一个巨大的进步...原创 2022-04-05 22:10:26 · 8521 阅读 · 7 评论 -
epoll的LT模式(水平触发)和ET模式(边沿触发)
epoll的触发模式是个引发讨论非常多的话题,网络上这方面总结的文章也很多,首先从名字上就不是很统一,LT模式常被称为水平触发、电平触发、条件触发,而ET模式常被称为边缘触发、边沿触发等,这些都是从英文翻译过来的,只不过翻译的时候有些差异,LT全称 level-triggered,ET全称 edge-triggered ...原创 2022-04-04 18:42:32 · 8734 阅读 · 8 评论 -
记一次使用Valgrind查找解决内存问题的玄幻旅程
看标题来说这应该是一篇教程式文章,但为了突出“玄幻”二字,我们不讲细节只讲过程,在过程中体会解决问题的方式和方法,以及避免一些我在这个过程中绕的弯路,如果想找工具的详细使用方法可以去参考文章中翻一翻,有几篇文章写的真不错,可以仔细看看...原创 2021-12-05 01:22:28 · 2068 阅读 · 0 评论 -
C++11中的std::atomic保证的原子性是什么
提到atomic这个词,你首先想到的是什么呢?作为一个长时间混迹于编程世界的菜鸟,我首先想到的一个词是“原子性”,接着飞入脑海的是 “ACID” 这个缩写词组,它是指事务管理的4个特性,常见于数据库操作管理中,它们分别是:原子性,一致性,隔离性和持久性...原子(atom)是在化学反应中不可分割基本微粒,而编程世界中的原子性也是取自这里的不可分割的含义,不可分割与事务管理中的原子性含义一致,指的是一个操作或者一系列操作只能全都执行或者都不执行...原创 2021-10-06 00:39:39 · 2938 阅读 · 0 评论 -
Dijkstra——通过不断松弛来解决单源最短路径问题的算法
Dijkstra算法又称迪杰斯特拉算法,它采用的是一种贪心的策略,使用广度优先搜索的方式解决带权有向图或者无向图的单源最短路径问题,需要注意的是它不能处理带负边权的情况,核心思想就是“守住现有阵地不断攻占底盘”,这一点可以在后面代码实现中慢慢体会,接下来梳理一下算法思路...原创 2021-09-12 23:38:00 · 1920 阅读 · 2 评论 -
Floyd-Warshall——仅用4行代码就能解决多源最短路径问题的算法
Floyd-Warshall算法简记Floyd算法,又称弗洛伊德算法,是解决任意两点间的最短路径问题的一种常用算法,核心思想就是“不断利用第三者影响原配关系”,这一点在5行核心代码中表现的淋漓尽致,接下来梳理一下算法思路...原创 2021-09-07 01:19:36 · 659 阅读 · 0 评论 -
从一个小题中的应用来体会下std::tie的便利之处
今天主要学习一下 `std::tie` 函数的使用方法,之前看到 `tie` 函数是和 IO 绑定的,最近发现它是和 `std::tuple` 绑定的,查询资料后发现两个函数虽然名字相同,但是在不同的作用域下,今天学一下和 tuple 有关的这个 `tie` 函数,不过在学习之前先看一道小题...原创 2021-08-15 23:49:22 · 880 阅读 · 0 评论 -
C++中使用std::sort自定义排序规则时要注意的崩溃问题
看到这个标题应该会有很多人一下子就懂了,也会有些人感到迷惑,简简单单排序怎么会奔溃呢?我第一次接触这个问题还是很久以前刚刚参加工作的时候,当时也是写出了导致程序崩溃的代码,通过上网查询解决了问题,至此以后就对这个 `sort` 函数警惕了一些,一直记得就是在sort的自定义函数中判断条件不要加等号,至于本质的原因一直没有去探究,正好最近又改了一个相关的问题,所以决定从源码和定义的角度来看看为什么会出现这个问题...原创 2021-08-09 00:03:45 · 11950 阅读 · 22 评论 -
C++11中std::move和std::forward到底干了啥
C++11中的右值引用的出现,在特定情况下减少了对象的拷贝,提升了C++程序的效率,伴随而来的 `std::move` 和 `std::forward` 也大量出现在程序代码中,但是这两个函数究竟干了啥呢?其实他们的本质都是转换函数,也就是完成左值和右值之间的转换,需要注意的是左值可以转换成右值,但是右值无法转换成左值...原创 2021-07-19 00:13:30 · 4741 阅读 · 27 评论 -
C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast
C/C++属于静态语言,也就是在编译时变量的数据类型即可确定的强类型语言。当不同的数据类型在一起运算或者相互赋值的时候,就需要进行数据类型转换。不同数据类型占用的内存空间不同,而各种数据类型的转换时有规则的,一种通用的规则就是“小转大”自动进行,“大转小”需要强制执行。这里的“大”和“小”指的是数据范围...原创 2021-07-12 00:30:50 · 13265 阅读 · 21 评论 -
换个角度来看看C++中的左值、右值、左值引用、右值引用
对于左值和右值有一个不太严谨的定义——在赋值表达式 `=` 左侧是的左值,而在 `=` 右侧的是右值。通过不断学习和尝试,最近我发现一个新的说法更加贴切,那就是“左值是容器,右值是东西”。对于这个定义我们可以类比一下水杯和水,通过水杯可以操作水杯中的水,操作过程中的中间结果如果想要进一步操作,可以将其放入其他的水杯,如果没有水杯就无法找到曾经操作过的水了,也就无法继续操作了...原创 2021-07-05 00:41:04 · 767 阅读 · 14 评论 -
手把手搭建一个redis集群
所谓“难者不会,会者不难”,这不只是一句简简单单的俗语,而是历经人类进化史而得到的历史经验,只有亲身体会过才会越发了解这句话的意义。当你苦思冥想几天几夜难以解决的问题,一句过来人的点拨便可瞬间化解,这是人生路上的需要经历的,愿每个人在关键时刻都能得到善良人的点拨...原创 2021-06-27 00:49:46 · 2219 阅读 · 0 评论 -
cpplint中filter参数的每个可选项的含义
`cpplint` 是一款优秀的代码格式检查工具,有了它可以统一整个团队的代码风格,完整的工具就是一个Python脚本,如果安装了Python环境,直接使用 `pip install cpplint` 命令就可以安装了,非常的方便...原创 2021-06-20 22:08:24 · 4902 阅读 · 8 评论 -
C++对我来说简直就是星辰大海,为了避免翻船,我选择从小河沟出发
以前觉得 C++ 并没有什么复杂的,不就是 C 语言加上类定义、模板、容器、算法函数这些就可以了吗,只要我不用,它就难不倒我,用到了查查文档也就搞定了,真的是年少轻狂啊。随着学习的深入渐渐发现,即使抛开那些算法函数、那些冗长的模板,单单是 C++ 核心的概念和类型就够喝上好几壶的,随便罗列几个,像 `std::furnitrue`、`std::memory_order`、`std::packaged_task` 等等这些,之前都没听说过,特别是C++20的协程,到现在还是一头雾水...原创 2021-05-30 00:33:02 · 781 阅读 · 6 评论 -
使用AddressSanitizer搭配addr2line查找C/C++内存泄漏问题
指针是C/C++程序中的利器,同时也引入了风险,现代C++中增加了智能指针来降低使用“裸”指针带来的风险,但是智能指针不是一颗银弹,它不能解决所有的指针问题,内存泄漏在C/C++程序开发中依旧是值得注意的,学会合理、合适的方法来查找内存泄漏问题也是一项有用的技能...原创 2021-05-16 00:11:29 · 1961 阅读 · 5 评论 -
protobuf中SerializeToString和SerializePartialToString的区别
protobuf是Google提出的序列化方案,此方案独立于语言和平台,目前提供了如c++、go、python等多种语言的实现,使用比较广泛,具有性能开销小,压缩率高等优点,是值得学习的优秀开源库...原创 2021-04-18 23:08:30 · 17189 阅读 · 13 评论 -
C++中一些可以在偷懒时直接使用的函数
在解决一些算法题时,会遇到一些“嵌套”问题,也就是一个题目中包含多个小的算法知识点,比如计算一个整数的二进制表示中1的个数,或者计算两个数的最大公约数,如果这些小问题本身就是题目,那么就只能“手撕”了...原创 2021-04-11 23:40:48 · 1623 阅读 · 3 评论 -
写给自己的KMP——C++版本
又翻到了这个算法,一个常用的子串(子数组)匹配算法,看一遍学一遍,学一遍忘一遍,反反复复,不过每次回忆起来所用的时间越来少了,其本质上就是在暴力搜索的基础上加上 next 数组加速匹配,算法的关键在于 next 数组的理解和求解方法...原创 2021-04-05 00:30:36 · 454 阅读 · 1 评论 -
C++中常见的字符判断与处理方法
字符串处理是编程世界中一项基础技能,特别是对于C/C++的程序员们,远没有那么多华丽的工具可以使用,大多数时候都需要一个个字符来判断和处理,甚至对于C语言来说都没有字符串类型,字符数组是其常见的等价结构,所以稳扎稳打的基本功尤其重要...原创 2021-03-28 23:35:22 · 12035 阅读 · 4 评论 -
C++中反向遍历map时怎样删除元素
今天在解决一个问题 《5710. 积压订单中的订单总数》 时用到了map的反向遍历,看到问题时首先想到了优先队列,但是需要维护一个大根堆和一个小根堆,感觉操作起来比较麻烦,突发奇想使用map就能够解决。map本身就是有序的,正向遍历可以得到从小到大的序列,而反向遍历就可以得到从大到小的序列,这个思路本身没有错,但是解题时卡在了反向遍历时如何删除元素的知识点上,特此记录一下...原创 2021-03-22 00:04:32 · 2003 阅读 · 6 评论 -
Go环境配置时遇到的GOPATH路径以及包管理问题
过了个年回到工作岗位,发现之前好好的 `Go` 环境无法进行调试了,于是又重新配置了一次,弄好之后发现新配的参数与原来完全不同,甚至还有一些矛盾的地方,真搞不清楚原来的配置参数怎么能成功调试的,也是奇了怪了。配置过程中还遇到了一些问题,特别记录一下,防止今后遇到类似问题还要苦苦寻找...原创 2021-02-21 01:25:17 · 8080 阅读 · 2 评论