![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++11
文章平均质量分 78
fpcc
行之苟有恒,久久自芬芳!
展开
-
跟我学C++中级篇——sleep和wait的不同
其实在实际应用中,二者的应用大多是泾渭分明的。但真正的细节上的区别,还是需要认真的掌握。不然在开发具体的工程时,可能会一时疏忽导致不可预测的问题和错误。还是那句话,细节决定成败,但不能拘泥于细节。这个度,就需要开发者自己不断养成自己的判断。原创 2024-08-24 09:28:47 · 677 阅读 · 0 评论 -
TBB中图的类型
纸上学来终觉浅啊,还是要亲自跑一下代码。实践和理论一起向前推进,才能更好的理解相关的程序代码和其内在的运行机制。原创 2024-08-18 08:58:40 · 269 阅读 · 0 评论 -
TBB中的join节点的Reservation
TBB框架有很多细节需要处理,但勿需焦虑。很多的细节其实在应用的时候儿就会自然的出现,不明白再去查阅相关的文档即可。重点是掌握好其整体的逻辑流程,抓大放小,强干弱枝。还是那句话,细节很重要,但不要限入细节不可自拔。原创 2024-08-18 08:33:27 · 230 阅读 · 0 评论 -
跟我学C++中级篇——返回值优化
在开发者编写代码的过程中,很多函数需要返回值的。如果只是简单的返回一个基础类型值,即使有一些浪费,这些浪费在整体的程序运行中其实影响还是相当小的。但当开发者自定义一些数据结构或者字符串等的返回时,就有可能出现多次拷贝的现象。这样的运行成本可能就相当大了。开发者在早期的编译期环境中,可能需要一些具体的技巧来处理这些返回值,但在越来越优秀的编译器加持下,返回值优化的手段从开发者不断的向编译期转移。这和前文(跟我学C++中级篇——临时对象)分析过的临时对象有着很大的联系,可一并参考学习分析。原创 2024-08-10 18:16:07 · 933 阅读 · 0 评论 -
并行编程实战——TBB节点类型
在节点的应用中,要注意区分单输入(输出)、多输入(输出)与广播、单播的不同。前者指只有一个输入输出的节点,后者指的是数据转发的方式。一般来说,前者控制的是节点中控制数据流的点的数量,后者指的是连接发送的策略。TBB的应用还是有很多细节可挖的,可惜一般的地方用不到这个框架。有兴趣的可以一起学习分析。原创 2024-08-04 09:51:10 · 688 阅读 · 1 评论 -
并行编程实战——TBB中的图
TBB中图的使用是一个非常巧妙的设计,但是一定要明白图设计中的一些细节,特别是图连接状态与节点激活间先后以及是否保证数据的安全流动(如不丢失数据)。在前面分析的文章中就遇到了这类问题,所以一定要把TBB整体的流程和协调方式以及各种相关关系理清,才可能更大限度的发挥TBB的性能。原创 2024-08-03 08:45:55 · 458 阅读 · 0 评论 -
分支预测分析
在前面的文章“C++20中的分支预测”中,对C++20中的静态分支预测进行了分析说明。本文从整体上对分支预测(Branch Prediction)进行一个全面的分析说明。首先来看一个分支预测的定义:由CPU预判程序分支的执行指令,从而减少错误方向的选择,加快运算速度。这项技术是从P5(奔腾5)处理器开始应用的。分支预测可以分为动态分支预测和静态分支预测两种。静态分支预测其实就是在编译程序时直接预测分支跳转的方向;而动态分支预测就是在程序运行时根据一定的算法来预测分支跳转方向。原创 2024-07-28 09:22:03 · 291 阅读 · 0 评论 -
跟我学C++中级篇——处理if条件分支语句
仍然是那句老话,“没有包打天下的技术”。想要灵活机变的综合应用各种技术解决实际问题,首先应该把基础打好,然后在实践中不断的应用总结。要善于发扬每种技术的长处,共同配合完成工作需要。所以搞技术学一些系统工程的知识也是相当有用处的。原创 2024-07-27 09:33:24 · 456 阅读 · 1 评论 -
跟我学C++中级篇——虚函数的性能
学习知识不是简单的为了会用,而是能够灵活的运用。要想灵活的运用,则必须掌握技术本质的内涵。只有把其内在体系掌握,才能在具体的场景上发挥其优势。这也是总说的从必然世界到自由世界的一个哲学问题。原创 2024-07-19 21:43:46 · 952 阅读 · 2 评论 -
跟我学C++中级篇——常见的错误问题分析
无论是菜鸟还是老鸟,在写C++代码时(也包括C中的部分),往往会犯一些常见的错误,可能这个错误回过头来看不算什么,但却经常让开发者忽视或者说忘记。这些问题大多都不是多么高深伯问题,修改后让人大呼真是大意了。很多问题,在前面的文章中都说明或者分析过,可能没有引起大家的重视,本文将其大略总结一下,以咨为正。主要是总结常见问题或者说一些容易忽视的问题,所以对复杂和不太常见的就不提了。C++学习曲线比较陡峭,之所以想总结一下这些常见问题,就是给入门和初中级开发者一个借鉴。原创 2024-07-13 08:24:36 · 327 阅读 · 2 评论 -
一步一步写线程之十五协程
人难得是选择,选择是最痛苦的。但一旦选择完成,朝着方向前进,其实反而没有什么可痛苦的了。今天讲协程,没有继续于以往的技术实现的原理和实现的框架或者应用的方法,而是从另外一个角度分析其在计算机发展过程上的定位。言简意浅,与诸君共勉!原创 2024-06-16 14:43:36 · 621 阅读 · 0 评论 -
c++工程实践——实际工程中的文件读取和日期处理的小问题
万丈高楼平地起,基础的重要性已经反复说得都麻了。但不得不说,往往都明白基础的重要性,可其实并未真正时刻挂在心上。上面的例子就说明了学习态度中的一些瑕疵,与诸君共同努力改正吧。原创 2024-06-14 21:56:58 · 361 阅读 · 1 评论 -
跟我学c++高级篇——技术进步对开发演进的影响
与时俱进,不断用发展的眼光看待和解决问题。掌握技术发展的规律并不断的跟进,有可能的话甚至参与到技术的创新中去,这才是一个开发者应该具备的基本认知。其实无论任何技术都是如此,最终发展成为一个哲学问题。与诸君共勉!原创 2024-06-09 18:38:11 · 988 阅读 · 1 评论 -
跟我学C++高级篇——回调函数及应用
之所以把回调函数放到高级篇,不是说回调函数本身有多么高级而是回调函数的应用是非常灵活的,用得精妙之处,完全可以放到高级的应用中。一个简单的回调函数,最大的优势是可控和安全。但回调函数不是没病的山梨儿,大家还是要斟酌考虑,不要滥用。原创 2024-06-07 23:47:58 · 1193 阅读 · 1 评论 -
c++外部模板
模板的优势估计很多人都知道,但是模板的劣势也有不少,其中,代码膨胀就是其中之一(其它还有不易理解、不易调试等)。上面的示例代码非常简单,但可以说明一个问题,在上一篇中提到过,c++的编译是以CPP为单元进行的,模板如果不使用就不会生成代码,那么如果在两个CPP文件中使用一样的数据类型会产生什么样的情况呢?比如上在这种情形,都是int类型,只是数据略有不同。答案是编译器肯定会生成两个完全相同的函数。原创 2024-06-05 17:42:44 · 388 阅读 · 1 评论 -
一步一步写线程之十四并行编程和并行库
古人说:“工欲善其事,必先利其器”,牛顿说要站在巨人的肩膀上,道理都是想通的。程序的设计开发也是如此,前人做过了很多非常有益的工作,后来者不必非再重复造一个轮子。但说这话得有一个前提,你得知道怎么造轮子,并且明白其内部的猫腻。学以致用,用而后思。不断总结推进自己的编程水平和提高自己的编程思想,这才是王道。并行编程并不是本系列文章的目的,这里把并行编程的相关进行基础的分析介绍,主要目的是让开发者明白,所谓并行框架的基石,仍然是多线(进)程编程。原创 2024-06-02 09:01:56 · 777 阅读 · 1 评论 -
一步一步写线程之十三队列间的消息通知
其实队列的处理,不光有这种细节需要处理,包括内存大小的处理,是否提前处理,都是需要考虑的。正如前面所说,一个队列的设计,不仅仅是一个算法的问题,可能涉及到很多的技术知识和相关的难点。如何能够综合运用这些知识适配开发场景,就是对设计师的一个考验了。原创 2024-06-01 08:19:11 · 461 阅读 · 1 评论 -
跟我学C++中级篇——if constexpr的应用
要关于对老的知识点的综合应用并不断的总结这种用法的可用之处,从而不断的推导出问题的解决办法。再通过这种解决办法可以看新的标准中是否有类似的更方便的方法,就可以更好的理解和认知一些技术点。可上层的给定的缓冲区内的数据类型确实是可变的,做为一个中间处理层,如何能够正确的引导程序自动适配准确的函数调用呢?本来这个非常简单,只要定义一个模板即可搞定,但这里偏偏有一个细节,是调用别人的库来实现写入。而这个库对不同的数据类型的写入,提供了N种不同的函数,这些函数只是名字和写入数据类型不同,其它都完全一样。原创 2024-05-31 21:53:18 · 556 阅读 · 0 评论 -
跟我学C++中级篇——内存屏障内存栅栏和编译器屏障以及相关
有锁和无锁就如武学上的有剑和无剑,重要的不是剑,是一种对内存原理的根本性的理解。不要对一些技术奉为圭臬,因为每一种技术一定有它的长处和短处。也就是常说的应用场景,只有会灵活运用,才是自由的编程。原创 2024-05-26 08:25:33 · 785 阅读 · 1 评论 -
一步一步写线程之十二无锁编程
这里需要声明一个问题,就是在生产者消费者绝对不对等的情况下,使用何种算法和技巧都是没有办法解决问题的。这句话是什么意思呢?就是说十个人干得活,如果只有一个小孩来干,用什么方法在当前状态下也是无解的。但如果合理的采用一些调度算法,安排一下流程,可能五个人就可以完成十个人的工作量。这是不是有点象武学上的“一力降十会”?同样,无锁队列的目的是提高效率,而不是从解决不可能解决的问题。大家千万不要走进误区,切记!原创 2024-05-25 10:25:12 · 351 阅读 · 1 评论 -
跟我学C++中级篇——字符串的转化
上面只是把常见的一些转化分析说明了一下,其实在不同的环境下,还有很多方法可以进行转换,比如使用字符一个个的处理来进行自定义,使用一些特定的函数(如各种库或框架的函数)等等。大家可以根据自己的实际情况来进行应用,不必拘泥于某种实现。但是需要引起注意的是,简单的方法往往不普遍适用,导致异常;普遍的方法往往不方便。鱼和熊掌不可得兼,请大家根据自己的场景来决定应用的方式。unicode编码相关等以后有机会再总结分析!原创 2024-05-19 11:33:08 · 573 阅读 · 1 评论 -
跟我学C++中级篇——字面量和字符串
其实从本文的分析就可以看出,标准的进步对编程还是非常有好处的。至少,可以减轻编译的复杂度。特别是在一些看起来不太起眼的地方,更是让开发者省心。所以,还是要与时俱进,拥抱变化。原创 2024-05-18 11:37:42 · 521 阅读 · 0 评论 -
跟我学C++中级篇——POD数据类型及演进
现在都知道数据是资产了,数据的定义就有数据类型,可以看这几种类型当成一种更抽象的层次的数据类型。怎么理解这句话呢?可以把常见的各种语言中的数据类型定义(如int,float等 )当成普通数据类型,而上面分析的数据类型理解为这些数据类型以上的更高层次的抽象。只要满足了特定的要求,就可以将其理解为这种数据类型。绕来绕去,真麻烦。这些数据类型有什么 用处呢?其实是兼容扩展,能够和其它语言保持数据交互,这其实是相当重要的。沟通几乎能治百病,慢慢理解。原创 2024-05-12 10:52:43 · 405 阅读 · 1 评论 -
跟我学C++中级篇——内联补遗
许多的技术看起来很简单,用起来也没有什么可以体察到困难的地方。比如这个inline,反正写不写以后编译器还要看自己心情来处理。但其实真正的向内部观察其原理,会发现有很多技术点在等着你去融会贯通。可以把inline的函数和变量通过汇编去深入分析一下,再查看一下它的具体的实现和优化的过程,好多细节的明白,会是开发者提升自己能力的一个重要的契机!原创 2024-05-11 21:20:59 · 513 阅读 · 0 评论 -
跟我学C++中级篇——const和constexpr的使用
要善于分析和总结学到的知识,要不断的回望自己学习的成果并加以整理分析。每一个简单的进步,其实都是思想上的一次升华,量变到质变,最终产生一次飞跃。古话说得好“勿以善小而不为”。原创 2024-05-04 14:37:16 · 420 阅读 · 1 评论 -
一步一步写线程之十一线程池应用内存池
可能有的同学说这个和在网上或者书上看到的内存池不大一样啊?其实本质是一样的。直接分配内存控制比特流,然后再分块拆分和上面的直接进行对象分配本质是相同的,不同的在于可能直接使用比特流会更灵活。或者说把本文叫做对象池,可能就更容易理解了。这一篇只是针对线程池中的内存池应用进行一个基础的分析说明,后面会抽时间对内存池有一个全面的分析说明。诸如内存池的大小分组(微型、小型、中型、大型)和是否连续处置(内存一次分配,分块使用)等,本文都没有涉及,目的只是一个很简单的在线程池中使用内存池,知其所以然即可。原创 2024-05-03 18:22:44 · 362 阅读 · 2 评论 -
跟我学C++高级篇——名称反射创建对象的一种实现的说明
这个怪偷懒的精神做祟,说明一下就好了。这也说明,对细节的说明一定要清晰严谨,不能想当然的别人也会这么理解。沟通的成本,就是这样产生的。原创 2024-05-02 10:26:12 · 286 阅读 · 2 评论 -
跟我学C++中级篇——零长度数组
其实零长度数组是一个技巧,这样的小技巧在C/C++中有很多。它们在一些特定的场景下有着非常好的应用,不过前面的定语一定要记清楚,特定的场景。这也是C/C++让初学者感到难缠的一个重要原因。到处都有一些特殊情况,而特殊情况里可能又套着特殊情况。这种小技巧的东西,不用刻意学习,用到了,想起来有,查查资料用就可以了。原创 2024-05-01 17:03:26 · 524 阅读 · 1 评论 -
跟我学C++中级篇——内联
内联的优势其实可以分成两个部分,一个是调用方面的,比如前面说的出栈入栈等;另外一个是调用时的优化,比如函数代码如果成为内联函数,编译就可以把一些类似的固定计算直接指定为计算的结果值。而内联的劣势,主要就在于内联导致的代码膨胀,而有些时候过度内联反而会导致性能的丧失。明白了内联的优缺点,就可以根据自己的实际开发需求来进行使用了。整体上而言,内联函数适合于小型、高频函数的调用,通常可以在ORM的数据库属性读写中看到。原创 2024-04-30 22:02:56 · 684 阅读 · 0 评论 -
一步一步写线程之十memory_order的应用
通过上述的分析和例程测试,可以清理的明白内存模型中内存顺序的意义。通过定义指定的内存序,可以防止编译器的一些特定的操作(指令重排和可见性等),也可以理解为,从标准上屏蔽了对编译器的额外的处理,使得数据在不同平台的不同线程中,只在语言层面就可以控制内存的数据交互。控制层面向高层发展的结果就是,降低了开发者和设计者的负担,能够更安全的进行多线程的数据编程。原创 2024-04-26 21:58:38 · 724 阅读 · 4 评论 -
跟我学C++高级篇——名称反射创建对象的一种实现
在后期的文章和实例中,大家会发现,会越来越多的把前面的知识融汇贯通,有可能再加上一些新知识点,就会实现一个比较好的技术点。所有的技术应用,一定是在基础技术上的不断的抽象升华。一种完全全新的,不以前边的技术为基础的技术,几乎很难遇到。或者如此说,即使遇到了,也可以通过老的技术快速的体会到新技术的优缺点。但这有一个前提,思想必须永远是开放包容,与时俱进!原创 2024-04-21 12:18:06 · 542 阅读 · 2 评论 -
跟我学C++高级篇——获取类型名称的番外小插曲
其实今天分析的这个现象,再次验证了标准是标准,实现是实现这个道理。标准指挥着实现,但实现不一定必须严格按标准来。有些标准未要求到的或者说对实现手段和结果没有要求的,这都是编译器厂商可以自行决定的。包括在实现标准后再在其基础上进行扩展支持的,这都不少见。标准是方向和目标,编译厂商是行动者和实践者,达到目的不一定非得走一条路。原创 2024-04-19 21:26:28 · 452 阅读 · 2 评论 -
跟我学c++高级篇——reflexpr
这一章的实践意义并不大,但实际意义其实是很大的。学习知识最容易的方式不是直接拿过来用,也不是从头一点点的扣出来。学习知识最快捷的方式是把当下的技术搞明白,同时把某些关键技术的来历再理清晰,脉络分明后,学习的效率就会迅速增加。简单是技术普及的前提!原创 2024-04-14 10:37:21 · 610 阅读 · 1 评论 -
一步一步写线程之八线程池的完善之三任务的封装
线程池中任务的封装处理其实是相当重要的一环,毕竟外来的任务需要从此承载到运行的线程上。也只有这一块设计的灵活可扩展,才能使线程池本身的应用更容易扩展。其实任务的封装有的时候儿可以针对具体的实现来实现,不需要抽象到一定层次。但是一个良好的设计,一定是从顶层抽象良好的。这本来就是一个矛盾,平衡点就在于开发者对开发的具体的要求和把控。原创 2024-04-13 09:12:00 · 274 阅读 · 2 评论 -
跟我学c++高级篇——常见的反射框架
在前面基本已经把基础的反射分析了一遍,通过这些学习,已经可以知道C++中反射的特点在哪里。他山之石,可以攻玉,在本篇就结合在网上的一些开源的反射框架来对反射加深一下印象。目前开源的c++反射框架中,各种类型的都有,复杂的简单的,针对具体类型的和通用的。一般来说,大厂和国外的开源写得相对要好一些,但不是说个人写的就不好,个人一般很多都是自己针对自己的具体场景,所以可能通用性差一些。原创 2024-04-03 19:53:50 · 918 阅读 · 0 评论 -
一步一步写线程之八线程池的完善之二数据结构封装
在分析完成数据结构的封装后,基本也就明白了在多线程中如何使用STL中的容器。但是,一般对线程安全的操作控制,都是使用锁。不管锁的粒度是大是小,对性能的影响一般来说都是比较大的。而多线程特别是线程池恰恰又都是在高性能的场景下应用,所以这时就需要开发者认真考虑加锁引起的性能损失。当然,在后面可以考虑在某些情况下使用无锁编程技术,让数据的处理更快捷。但无锁编程也不是万能的,它也是有其相对的应用场景。万流归宗,还是需要开发者对整体技术的把握和实际应用场景进行综合考虑。原创 2024-03-31 08:45:13 · 621 阅读 · 2 评论 -
C++20中的jthread
其实还有几个特点值得说说,但不准备再讲了,虽然已经投票完成确定了c++20的标准,但毕竟还没有正式增加进去,大家有兴趣可以看看源码。整体来看,c++应用还是越来越方便,这对c++来说,肯定是个好事情。现在就希望>VS2019或者>GCC11中,尽快完全支持。原创 2024-03-29 22:47:00 · 1212 阅读 · 1 评论 -
c++20中的jthread再谈
在前面的C++20新功能中,简单的介绍过相关的std::jthread的应用。当时觉得它虽然比std::thread方便一些,但也没有多大的优势。可在后面的不断的学习中,发现std::jthread的使用上确实有优秀之处,相对于传统的线程编程,等于是提前安全的封装了对线程安全管理和控制的相关模块和接口。目前很少听说在实际工程中有应用jthread的,可能大家觉得thread就比较好用,也可能是开发习惯和代码惯性的问题。原创 2024-03-29 22:31:27 · 994 阅读 · 0 评论 -
跟我学C++中级篇——委托构造和继承构造
学习C++的开发者都知道,在C++的类定义中,传统的会有常见的六个默认和构造相关的函数(不明白的可以去查一下资料)。但在实际情况中,经常会遇到一些具体的开发场景,只用这几个函数可能还是会导致重复代码的出现。开发者在学习编程之初,估计都会有人不断告诉你,只要有重复代码,就有优化的可能性。但是,如果代码的重复到了最基础的阶段,开发者一般就无能为力了,即使使用了一些特殊的技巧,也会导致代码的可读性和可维护性的降低。本篇主要是分析构造函数在重载和继承时遇到的重复代码的问题。原创 2024-03-29 22:25:24 · 561 阅读 · 0 评论 -
一步一步写线程之八线程池的完善之一线程管理
在前面实现了一个很粗陋的线程池,那么它的运行没有动态控制,相关线程池的动态伸缩也没有控制,这一切,在实际的应用中,是应该存在的。本篇文章就将相关的实现方法和源码分析一下。在前面的文章发出去后,有兄弟留言说这个太简陋,对实际应用没啥作用。其实这个系列的文章重点不是一开始就推出一个完善的线程池供大家使用,更多的给初学写线程池的人一个设计编写的实操过程。正如前面反复说的,一个好的线程池一定是适应一种或少数几种场景的而不是普适于所有场景。所以重要是让大家有一个理解网上开源的线程池是如何写出来的过程。原创 2024-03-23 19:53:08 · 801 阅读 · 0 评论