C++
文章平均质量分 77
fpcc
行之苟有恒,久久自芬芳!
展开
-
c++应用网络编程之五Windows常用的网络IO模型
在Windows平台上,网络高并发的开发,重点以游戏居多。其它的当然也可以做,毕竟IOCP可不是白给的。其实游戏行业是一个非常好的方向,开发者如果有兴趣的话可以深入的学习研究。当人们吃饱饭的时候儿,精神食粮就提到了必须的日程上来。至于游戏对青少年的影响,就看大环境了。已经好多年不在Windows上进行编程了,以后的网络编程重要分析也是以类Linux平台为主。原创 2024-07-21 13:02:43 · 574 阅读 · 1 评论 -
c++应用网络编程之四Linux常用的网络IO模型
实事求是,与时俱进,理论联系实际,实践是检验真理的唯一标准…,这些理论每个人可能都会脱口而出。但真正的应用环节呢?可能绝大多数人会有意无意的找各种借口,陈陈相因,因循守旧,更别提创新意识了。只有在实践中深入分析掌握了现有技术的优劣,才可能知晓应用场景下的各种技术不足,才可能产生创新意识。网络编程中这种例子特别多(如io_uring,dpdk),毕竟实际应用的在不断提高对网络技术的要求。而更可怕的是,这种要求不但没有降低还在不断的提高。原创 2024-07-20 10:49:21 · 622 阅读 · 1 评论 -
跟我学C++中级篇——虚函数的性能
学习知识不是简单的为了会用,而是能够灵活的运用。要想灵活的运用,则必须掌握技术本质的内涵。只有把其内在体系掌握,才能在具体的场景上发挥其优势。这也是总说的从必然世界到自由世界的一个哲学问题。原创 2024-07-19 21:43:46 · 882 阅读 · 2 评论 -
跟我学C++中级篇——常见的错误问题分析
无论是菜鸟还是老鸟,在写C++代码时(也包括C中的部分),往往会犯一些常见的错误,可能这个错误回过头来看不算什么,但却经常让开发者忽视或者说忘记。这些问题大多都不是多么高深伯问题,修改后让人大呼真是大意了。很多问题,在前面的文章中都说明或者分析过,可能没有引起大家的重视,本文将其大略总结一下,以咨为正。主要是总结常见问题或者说一些容易忽视的问题,所以对复杂和不太常见的就不提了。C++学习曲线比较陡峭,之所以想总结一下这些常见问题,就是给入门和初中级开发者一个借鉴。原创 2024-07-13 08:24:36 · 295 阅读 · 2 评论 -
并行编程实战——TBB编程流图的问题
有时间应该看看TBB的底层源码。其实可能看到源码,瞬间就明白了原因,可是现在只是上层应用,那么就只能靠经验和文档来处理类似的问题了。框架的运用,其实重点在于明白其内在的运行逻辑和控制流程,再加以代码辅助,文档说明,这是最佳的打手伴侣。原创 2024-07-12 22:10:10 · 826 阅读 · 1 评论 -
c++应用网络编程之二网络的IO模型
网络服务端编程是复杂的,要先从宏观上把网络通信的相关机制搞清楚。这样才能更好的在开发过程中明白一些细节的掌控,而不至于迷失在细节当中。这个系列会从顶层一点点的抽丝剥茧的把相关背景和技术栈分析展开,并对它们的相对关系进行分析说明。某些具体的细节如果不必要就不展开了,请大家自行查阅相关书籍或者资料。原创 2024-07-06 10:52:02 · 879 阅读 · 1 评论 -
c++应用网络编程之一基本介绍
c++编程的应用场景在前面分析过,一个重要的方向就是网络编程。一般来说,开发者说的服务端编程在c++方向上简单的可以认为是网络编程。首先需要说明的,本系列不对网络编程的相关基础知识展开详细的说明,因为这种知识在书本上太多了。网络上各种资料更是满开飞,没有必要拷贝来拷贝去的。特别是一些协议等的解析说明,如果不遇到特定的问题不会深入分析说明。那么最应该明白的网络编程是什么?那么就得明白网络是如何而来。网络,从名字上很好理解,一张把“经络”连接起来的大网。原创 2024-06-30 11:10:36 · 675 阅读 · 3 评论 -
网络编程之XDP、TC和IO_URING以及DPDK
学习理论知识十分的枯燥,特别对工作后的人,不论是从记忆力还是注意力,已经从单纯的学习转向了为了生活而打拼。此时对一些理论性的东西往往感到没有什么意义。但还是需要强调的是,计算机技术是一门非常强的理论和实践高度结合的技术学科。理论和实践缺一不可,新技术的突破往往是开发应用瓶颈的突破口,不需要到处再打补丁;同样,丰富的实践场景可以推动技术的完善和创新。思维不要僵化,要与时俱进。原创 2024-06-23 09:31:47 · 569 阅读 · 2 评论 -
网络编程之XDP技术的基础eBPF
eBPF的发展史,就是一部需求推进的发展史。所以说,技术不落地,发展的速度就会受限。反过来,强劲的落地需求,推动着技术不断的完善和快速发展。学习也是如此,如果只是为了学习新技术而学习,无法在实际工作中应用,那么技术学习了往往也会被忘记。而如果在实际的场景中应用到,那么对技术的理解会越来越深越来越通晓。这样,在后面的工作中会应用的如鱼得水。甚至有可能反过来,深入技术内部进行完善和修改。原创 2024-06-22 11:04:01 · 1066 阅读 · 1 评论 -
一步一步写线程之十五协程
人难得是选择,选择是最痛苦的。但一旦选择完成,朝着方向前进,其实反而没有什么可痛苦的了。今天讲协程,没有继续于以往的技术实现的原理和实现的框架或者应用的方法,而是从另外一个角度分析其在计算机发展过程上的定位。言简意浅,与诸君共勉!原创 2024-06-16 14:43:36 · 602 阅读 · 0 评论 -
网络编程之XDP和TC
创新是技术的灵魂。不断重复的技术其实就是一种落后的表现。做为一个开发者,加入创新技术的大军可能是很小概率的事件,但不代表对新技术的不敏感。对于开发者来说,新技术的优秀重点在于落地。不能落地的新技术,还不如老的技术。原创 2024-06-15 12:10:51 · 735 阅读 · 2 评论 -
c++工程实践——实际工程中的文件读取和日期处理的小问题
万丈高楼平地起,基础的重要性已经反复说得都麻了。但不得不说,往往都明白基础的重要性,可其实并未真正时刻挂在心上。上面的例子就说明了学习态度中的一些瑕疵,与诸君共同努力改正吧。原创 2024-06-14 21:56:58 · 346 阅读 · 1 评论 -
跟我学c++高级篇——技术进步对开发演进的影响
与时俱进,不断用发展的眼光看待和解决问题。掌握技术发展的规律并不断的跟进,有可能的话甚至参与到技术的创新中去,这才是一个开发者应该具备的基本认知。其实无论任何技术都是如此,最终发展成为一个哲学问题。与诸君共勉!原创 2024-06-09 18:38:11 · 966 阅读 · 1 评论 -
跟我学C++高级篇——回调函数及应用
之所以把回调函数放到高级篇,不是说回调函数本身有多么高级而是回调函数的应用是非常灵活的,用得精妙之处,完全可以放到高级的应用中。一个简单的回调函数,最大的优势是可控和安全。但回调函数不是没病的山梨儿,大家还是要斟酌考虑,不要滥用。原创 2024-06-07 23:47:58 · 945 阅读 · 1 评论 -
c++外部模板
模板的优势估计很多人都知道,但是模板的劣势也有不少,其中,代码膨胀就是其中之一(其它还有不易理解、不易调试等)。上面的示例代码非常简单,但可以说明一个问题,在上一篇中提到过,c++的编译是以CPP为单元进行的,模板如果不使用就不会生成代码,那么如果在两个CPP文件中使用一样的数据类型会产生什么样的情况呢?比如上在这种情形,都是int类型,只是数据略有不同。答案是编译器肯定会生成两个完全相同的函数。原创 2024-06-05 17:42:44 · 375 阅读 · 1 评论 -
一步一步写线程之十四并行编程和并行库
古人说:“工欲善其事,必先利其器”,牛顿说要站在巨人的肩膀上,道理都是想通的。程序的设计开发也是如此,前人做过了很多非常有益的工作,后来者不必非再重复造一个轮子。但说这话得有一个前提,你得知道怎么造轮子,并且明白其内部的猫腻。学以致用,用而后思。不断总结推进自己的编程水平和提高自己的编程思想,这才是王道。并行编程并不是本系列文章的目的,这里把并行编程的相关进行基础的分析介绍,主要目的是让开发者明白,所谓并行框架的基石,仍然是多线(进)程编程。原创 2024-06-02 09:01:56 · 770 阅读 · 1 评论 -
一步一步写线程之十三队列间的消息通知
其实队列的处理,不光有这种细节需要处理,包括内存大小的处理,是否提前处理,都是需要考虑的。正如前面所说,一个队列的设计,不仅仅是一个算法的问题,可能涉及到很多的技术知识和相关的难点。如何能够综合运用这些知识适配开发场景,就是对设计师的一个考验了。原创 2024-06-01 08:19:11 · 454 阅读 · 1 评论 -
跟我学C++中级篇——if constexpr的应用
要关于对老的知识点的综合应用并不断的总结这种用法的可用之处,从而不断的推导出问题的解决办法。再通过这种解决办法可以看新的标准中是否有类似的更方便的方法,就可以更好的理解和认知一些技术点。可上层的给定的缓冲区内的数据类型确实是可变的,做为一个中间处理层,如何能够正确的引导程序自动适配准确的函数调用呢?本来这个非常简单,只要定义一个模板即可搞定,但这里偏偏有一个细节,是调用别人的库来实现写入。而这个库对不同的数据类型的写入,提供了N种不同的函数,这些函数只是名字和写入数据类型不同,其它都完全一样。原创 2024-05-31 21:53:18 · 462 阅读 · 0 评论 -
跟我学C++中级篇——内存屏障内存栅栏和编译器屏障以及相关
有锁和无锁就如武学上的有剑和无剑,重要的不是剑,是一种对内存原理的根本性的理解。不要对一些技术奉为圭臬,因为每一种技术一定有它的长处和短处。也就是常说的应用场景,只有会灵活运用,才是自由的编程。原创 2024-05-26 08:25:33 · 639 阅读 · 1 评论 -
一步一步写线程之十二无锁编程
这里需要声明一个问题,就是在生产者消费者绝对不对等的情况下,使用何种算法和技巧都是没有办法解决问题的。这句话是什么意思呢?就是说十个人干得活,如果只有一个小孩来干,用什么方法在当前状态下也是无解的。但如果合理的采用一些调度算法,安排一下流程,可能五个人就可以完成十个人的工作量。这是不是有点象武学上的“一力降十会”?同样,无锁队列的目的是提高效率,而不是从解决不可能解决的问题。大家千万不要走进误区,切记!原创 2024-05-25 10:25:12 · 340 阅读 · 1 评论 -
跟我学C++中级篇——字符串的转化
上面只是把常见的一些转化分析说明了一下,其实在不同的环境下,还有很多方法可以进行转换,比如使用字符一个个的处理来进行自定义,使用一些特定的函数(如各种库或框架的函数)等等。大家可以根据自己的实际情况来进行应用,不必拘泥于某种实现。但是需要引起注意的是,简单的方法往往不普遍适用,导致异常;普遍的方法往往不方便。鱼和熊掌不可得兼,请大家根据自己的场景来决定应用的方式。unicode编码相关等以后有机会再总结分析!原创 2024-05-19 11:33:08 · 561 阅读 · 1 评论 -
跟我学C++中级篇——字面量和字符串
其实从本文的分析就可以看出,标准的进步对编程还是非常有好处的。至少,可以减轻编译的复杂度。特别是在一些看起来不太起眼的地方,更是让开发者省心。所以,还是要与时俱进,拥抱变化。原创 2024-05-18 11:37:42 · 475 阅读 · 0 评论 -
跟我学C++中级篇——POD数据类型及演进
现在都知道数据是资产了,数据的定义就有数据类型,可以看这几种类型当成一种更抽象的层次的数据类型。怎么理解这句话呢?可以把常见的各种语言中的数据类型定义(如int,float等 )当成普通数据类型,而上面分析的数据类型理解为这些数据类型以上的更高层次的抽象。只要满足了特定的要求,就可以将其理解为这种数据类型。绕来绕去,真麻烦。这些数据类型有什么 用处呢?其实是兼容扩展,能够和其它语言保持数据交互,这其实是相当重要的。沟通几乎能治百病,慢慢理解。原创 2024-05-12 10:52:43 · 372 阅读 · 1 评论 -
跟我学C++中级篇——封装对象的实践
面向对象编程是一种非常广泛的编译方式,很多开发者可能对它是既了解又不了解。对一些基础的知识会用,但又不知道是否用得合适,能不能有一个标准来判定。其实这恰恰表明对面向对象编程还是掌握的不够深入。一切设计没有标准只有原则,这也意味着,实际场景下,在考虑原则的同时,更要考虑实际的需求进行适当的取舍。最好的设计方法是没有的,只有最合适的设计方法。原创 2024-05-11 21:25:30 · 581 阅读 · 4 评论 -
跟我学C++中级篇——内联补遗
许多的技术看起来很简单,用起来也没有什么可以体察到困难的地方。比如这个inline,反正写不写以后编译器还要看自己心情来处理。但其实真正的向内部观察其原理,会发现有很多技术点在等着你去融会贯通。可以把inline的函数和变量通过汇编去深入分析一下,再查看一下它的具体的实现和优化的过程,好多细节的明白,会是开发者提升自己能力的一个重要的契机!原创 2024-05-11 21:20:59 · 497 阅读 · 0 评论 -
跟我学C++中级篇——const和constexpr的使用
要善于分析和总结学到的知识,要不断的回望自己学习的成果并加以整理分析。每一个简单的进步,其实都是思想上的一次升华,量变到质变,最终产生一次飞跃。古话说得好“勿以善小而不为”。原创 2024-05-04 14:37:16 · 409 阅读 · 1 评论 -
一步一步写线程之十一线程池应用内存池
可能有的同学说这个和在网上或者书上看到的内存池不大一样啊?其实本质是一样的。直接分配内存控制比特流,然后再分块拆分和上面的直接进行对象分配本质是相同的,不同的在于可能直接使用比特流会更灵活。或者说把本文叫做对象池,可能就更容易理解了。这一篇只是针对线程池中的内存池应用进行一个基础的分析说明,后面会抽时间对内存池有一个全面的分析说明。诸如内存池的大小分组(微型、小型、中型、大型)和是否连续处置(内存一次分配,分块使用)等,本文都没有涉及,目的只是一个很简单的在线程池中使用内存池,知其所以然即可。原创 2024-05-03 18:22:44 · 353 阅读 · 2 评论 -
跟我学C++高级篇——名称反射创建对象的一种实现的说明
这个怪偷懒的精神做祟,说明一下就好了。这也说明,对细节的说明一定要清晰严谨,不能想当然的别人也会这么理解。沟通的成本,就是这样产生的。原创 2024-05-02 10:26:12 · 272 阅读 · 2 评论 -
跟我学C++中级篇——零长度数组
其实零长度数组是一个技巧,这样的小技巧在C/C++中有很多。它们在一些特定的场景下有着非常好的应用,不过前面的定语一定要记清楚,特定的场景。这也是C/C++让初学者感到难缠的一个重要原因。到处都有一些特殊情况,而特殊情况里可能又套着特殊情况。这种小技巧的东西,不用刻意学习,用到了,想起来有,查查资料用就可以了。原创 2024-05-01 17:03:26 · 484 阅读 · 1 评论 -
跟我学C++中级篇——内联
内联的优势其实可以分成两个部分,一个是调用方面的,比如前面说的出栈入栈等;另外一个是调用时的优化,比如函数代码如果成为内联函数,编译就可以把一些类似的固定计算直接指定为计算的结果值。而内联的劣势,主要就在于内联导致的代码膨胀,而有些时候过度内联反而会导致性能的丧失。明白了内联的优缺点,就可以根据自己的实际开发需求来进行使用了。整体上而言,内联函数适合于小型、高频函数的调用,通常可以在ORM的数据库属性读写中看到。原创 2024-04-30 22:02:56 · 672 阅读 · 0 评论 -
一步一步写线程之十memory_order的应用
通过上述的分析和例程测试,可以清理的明白内存模型中内存顺序的意义。通过定义指定的内存序,可以防止编译器的一些特定的操作(指令重排和可见性等),也可以理解为,从标准上屏蔽了对编译器的额外的处理,使得数据在不同平台的不同线程中,只在语言层面就可以控制内存的数据交互。控制层面向高层发展的结果就是,降低了开发者和设计者的负担,能够更安全的进行多线程的数据编程。原创 2024-04-26 21:58:38 · 707 阅读 · 4 评论 -
跟我学C++中级篇——临时对象
如果工程对效率要求不高,其实对临时对象的处理也不用费什么心思。赶哪的集用哪的斗,不用刻意非得怎么着才行。主打一个兼顾效率和开发的平衡,优化未必时时都是一个必选项。原创 2024-04-26 21:11:23 · 354 阅读 · 0 评论 -
跟我学C++高级篇——名称反射创建对象的一种实现
在后期的文章和实例中,大家会发现,会越来越多的把前面的知识融汇贯通,有可能再加上一些新知识点,就会实现一个比较好的技术点。所有的技术应用,一定是在基础技术上的不断的抽象升华。一种完全全新的,不以前边的技术为基础的技术,几乎很难遇到。或者如此说,即使遇到了,也可以通过老的技术快速的体会到新技术的优缺点。但这有一个前提,思想必须永远是开放包容,与时俱进!原创 2024-04-21 12:18:06 · 514 阅读 · 2 评论 -
一步一步写线程之九线程池任务的窃取
对绝大多数软件人员而言,其实很多技术拼到最后不是拼设计者的聪明才智,拼的是经验。特别是对于工程类的开发更是如此。而软件开发领域,基本以现有的成熟的技术为主,这点就更突出。随着软件的规模越大,经验的要求越高。很多开发者可能终其一生都遇不到所谓的千万并发,那希望他设计一个支持千万并发的服务,就是一个不可能的任务,其它情况亦是如此。所以开发者们勿需气馁,把基础打好,认真学习,找机会就上。不断总结经验得失,技术就会越来越磨炼得精粹。原创 2024-04-20 10:23:28 · 645 阅读 · 1 评论 -
跟我学C++高级篇——获取类型名称的番外小插曲
其实今天分析的这个现象,再次验证了标准是标准,实现是实现这个道理。标准指挥着实现,但实现不一定必须严格按标准来。有些标准未要求到的或者说对实现手段和结果没有要求的,这都是编译器厂商可以自行决定的。包括在实现标准后再在其基础上进行扩展支持的,这都不少见。标准是方向和目标,编译厂商是行动者和实践者,达到目的不一定非得走一条路。原创 2024-04-19 21:26:28 · 417 阅读 · 2 评论 -
跟我学c++高级篇——reflexpr
这一章的实践意义并不大,但实际意义其实是很大的。学习知识最容易的方式不是直接拿过来用,也不是从头一点点的扣出来。学习知识最快捷的方式是把当下的技术搞明白,同时把某些关键技术的来历再理清晰,脉络分明后,学习的效率就会迅速增加。简单是技术普及的前提!原创 2024-04-14 10:37:21 · 556 阅读 · 1 评论 -
一步一步写线程之八线程池的完善之三任务的封装
线程池中任务的封装处理其实是相当重要的一环,毕竟外来的任务需要从此承载到运行的线程上。也只有这一块设计的灵活可扩展,才能使线程池本身的应用更容易扩展。其实任务的封装有的时候儿可以针对具体的实现来实现,不需要抽象到一定层次。但是一个良好的设计,一定是从顶层抽象良好的。这本来就是一个矛盾,平衡点就在于开发者对开发的具体的要求和把控。原创 2024-04-13 09:12:00 · 267 阅读 · 2 评论 -
跟我学c++高级篇——常见的反射框架
在前面基本已经把基础的反射分析了一遍,通过这些学习,已经可以知道C++中反射的特点在哪里。他山之石,可以攻玉,在本篇就结合在网上的一些开源的反射框架来对反射加深一下印象。目前开源的c++反射框架中,各种类型的都有,复杂的简单的,针对具体类型的和通用的。一般来说,大厂和国外的开源写得相对要好一些,但不是说个人写的就不好,个人一般很多都是自己针对自己的具体场景,所以可能通用性差一些。原创 2024-04-03 19:53:50 · 718 阅读 · 0 评论 -
跟我学C++中级篇——STL中的删除
在STL中一般删除的方式有两类,一种是使用全局的std::remove(remove_if类似),一种是使用容器自带的erase,前者其实并没有真正的删除数据,而后者则是在移动时,会有一些细节的处理,否则要么程序崩溃,要么达不到删除的目的。下面就这两个函数进行一下分析说明。在一些容器中也提供了remove(如std::list)方法,它和全局的std::remove还是用法区别不小的,这个大家需要自己看一下。注:C++20提供了std::erase这种更方便的用法。原创 2024-03-22 21:35:03 · 506 阅读 · 0 评论 -
一步一步写线程之七面向应用的线程池
写线程其实是一个很考验经验的活儿,不光要掌握理论,对实际中使用线程遇到的各种问题,往往理论不会解释这么细。但是,如果在解决问题的过程中,就会发现,其实这些与理论是完全相符合的。而设计一个好的线程池需要不断的从理论上指导完善并且在实际场景不断打磨。还是老话,不可能有一个放之四海而皆准的线程池,但肯定有一个在本公司用起来很不错的线程池。庄子在《人间世》中说:“其作始也简,其将毕也必巨!”与诸君共勉!原创 2024-03-17 09:21:32 · 1056 阅读 · 2 评论