- 博客(531)
- 资源 (21)
- 问答 (1)
- 收藏
- 关注
原创 DPDK系列之四十二DPDK应用网络编程
DPDK的应用还是有些复杂,不过从费效比看还是相当不错的。特别是在某些大型网络通信应用中,使用DPDK的优势还是很明显的。至于普通的网络编程还是老实的使用系统自带的Socket会更简单方便。在后面会对网络通信中使用DPDK进行具体的TCP/UDP应用分别分析说明。要善于利用技术而不是让技术成为一种思想上的拖累。
2024-03-17 16:01:18 149 2
原创 一步一步写线程之七面向应用的线程池
写线程其实是一个很考验经验的活儿,不光要掌握理论,对实际中使用线程遇到的各种问题,往往理论不会解释这么细。但是,如果在解决问题的过程中,就会发现,其实这些与理论是完全相符合的。而设计一个好的线程池需要不断的从理论上指导完善并且在实际场景不断打磨。还是老话,不可能有一个放之四海而皆准的线程池,但肯定有一个在本公司用起来很不错的线程池。庄子在《人间世》中说:“其作始也简,其将毕也必巨!”与诸君共勉!
2024-03-17 09:21:32 808 2
原创 gprof安装使用(CMake)说明
时隔多年,在CMake工程中再次使用此工具,有些细节已经改变,安装环境也略有不同,所以重新总结安装步骤,以咨为记。
2024-03-10 12:16:50 310 2
原创 C++的萃取技术
在《模板类型的自动推导》中提到了c++是一门静态编译语言,不支持动态类型的获取,也就更不用说提供类似c#,Java等语言的反射机制。但是,没有类型获取的接口不代表没有这种实际的需求,那么怎么解决这种需求就得靠c++的大牛们来想办法啦。微软的MFC通过大量的定义宏来动态的生成各种类和对象。而这种方式恰恰又不是c++大牛们觉得舒适的方法,所以他们想到了模板。在模板中,提供了Traits(萃取)技术,什么是萃取呢?简单来说,就是能够获得目标对象的类型,并依此而实现此类型对应的功能。
2024-03-10 10:58:01 506 2
原创 跟我学c++高级篇——类反射
反射对c++是不是一种鸡肋,这个还真不好说。不过有一句话可以引入进来,“发展是硬道理”,只要是不断的发展,就会有机会。而停滞不前的空谈理论,一定是没有前途的。至于以后反射在c++后续标准里会成为什么样子,大家拭目以待即可。
2024-03-09 16:34:05 310
原创 gperftools的安装使用说明
gperftools是Google推出一个非常强大的性能分析工具集,在以前使用时进行过文档的整理,但时过境迁,这里又有了一些不同,正好实际工程用到它,对其的安装和使用说明进行一次完整的文档化。gperftools主要包含三个功能:1、分析 CPU 性能能够通过统计一定时间内各个功能单元(线程、函数等)的执行时间并给出其占用比例,从而确定CPU瓶颈2、分析内存占用统计单位时间内各单元对内存的占用数量并查找是否有内存泄露3、自动检查内存泄露具体的图就不贴了,基本和原来的差不多。
2024-03-08 22:06:11 655 2
原创 跟我学c++中级篇——手动实现类tuple
到最后的实现仍然是使用了类似std::tuple的实现,通过索引ID来获取不同类型的具体的指针。其实最初是想的通过一个基类形成的静态容器返回然后通过多态来达到对不同类型的控制。可惜的是模板的匹配总是无法通过,只好改成一个动态生成动态获取的过程。后来又想通过在遍历的时候儿拿到对象指针而非固定写到指定的索引上,毕竟这样就无法修改对象生成的顺序了。可又无法解决不同对象回传的问题(通过基类返回直接就崩溃了)。故而目前只能还是先使用这种索引控制来得到具体的对象指针,以后有机会再优化它。
2024-03-03 17:59:32 259 2
原创 零拷贝技术深入分析
其实说得更浅显一些,所谓零拷贝更准确的说不是零次拷贝,是指尽可能的减少拷贝。在DPDK的系列文章中,这种操作被发挥的淋漓尽致。互联网的口号就是“不让中间商赚差价”,这个在现实上可能有一些逻辑上的BUG,但在内存操作上确实是非常用益。当然,万事万物不是说是绝对的,有的时候,抽象一下,加一层,如果能达到更好的效果,又不影响实际的使用的情况下,岂不更妙?千头万绪又回到始终坚持的原则,应用场景决定应用技术,实践是检验真理的标准。
2024-03-01 21:58:12 716 3
原创 DPDK系列之四十一数据收发整体流程源码分析之三接收和发送数据
虽然侯教师说“源码面前,了无秘密”。可对于大的框架型软件来说,阅读代码确实相当吃力,特别是国内的编程水平和编程风格和国外的还有很大的不同,特别是一些具体的处理手段,有些高明之处不是一下两下就能看明白的。还有就是可能应用的具体的技术和国内也有不同,这就导致相关的代码阅读对于一些硬上的同学们非常有难度。但还是那个字,干!
2024-02-24 18:59:12 501 2
原创 跟我学C++中级篇——单实例和静态化
到最后,总结各种经验其实可以发现,在实际的应用场景上,使用一些习惯用法或者说设计模式的目的,主要是为了扩展性和防御性编程。如果能够明确的知道不会发生或者某些异常会被阻止的情况下,不进行使用其实也是没问题的(话只能说到这儿,大家自己考虑)。说这些话的目的就是,经验是个好东西,但不要陷入经验主义,书本是个好东西,不要陷入本本主义。实践是检验真理的唯一标准,抓住老鼠的一定是好猫。
2024-02-23 21:37:01 993 2
原创 跟我学C++中级篇——C++17标准后的std::invoke系列
C++的变化是有目共睹的,虽然在前两年特殊情况下导致一些新技术没有被应用到想象的版本中,但在后续版本的迭代中,仍然在不断的增加和完善。C++学习的成本看似有些降低了,但实际上可能增加的成本更多了。这并不矛盾,新标准下编程可能更简单了,但背后的逻辑却更复杂了;新标准更容易理解了,但新老标准的代码混合在一起更难了。况且,大多数的编程人员仍然使用C++98,C++11的普及都没有想象的多,更别提C++14以后的标准了。不过不要着急,慢慢来,只要坚持学习,就会达到彼岸,毕竟,学习成本比创造成本要低得多。
2024-02-23 21:29:14 1068
原创 DPDK系列之四十一数据收发整体流程源码分析之二流程框架
不同的版本的DPDK可能源码会有些不同,请注意版本即可。重点是把DPDK的相关应用熟悉,在此基础上才能更好的对DPDK的框架有所了解。由应用到内部的实现,可能会更好的理解DPDK的设计理念和相关技术特点。
2024-02-17 21:11:00 365 2
原创 跟我学c++中级篇——静态多态
从比较正式的定义来说,在c++中,一般不会把特定多态或者宏多态称为多态,以方便和C语言区分,一般来说,静态多态指的就是模板的静态多态。其实很多的定义和概念并不是说有多么特别的技术在内,很重要的一点在于通过这些定义或概念来更好的理解实际应用中的应用。可以简单将其当成一种对实际应用的抽象,从某种角度了对知识体系的一种系统的归类总结。这是学习编程的另外一种经验,大家可以借鉴一下。
2024-02-14 23:53:39 361 2
原创 跟我学c++中级篇——std::tuple的复合操作
std::tuple的初级应用,如生成和获取,在前面的几篇文章中已经进行了较详细的说明。但std::tuple仍然有一些复杂的应用,在实际的应用过程中有很大的作用,比如遍历,本文将在这些角度上进行举例分析。不过,还是那句话,只有最合适的,没有最好的。遍历的方法有很多,开源库和网上有不少的相关例程,特别是随着C++更新的标准出台,更多简单易行的方法会跟随出来。std::tuple的遍历,在STL库并未提供,它的实现机理是一个特化的过程,所以不能将其理解为容器,这也是没有提供遍历的可能吧。
2024-02-08 18:59:06 286 2
原创 跟我学C++中级篇——函数模板的匹配
在本文会尝试着把函数的重载以及模板自动推导等方法结合起来,一起分析模板函数的匹配的方式和原则。在普通的函数重载和普通的模板函数中,都比较容易理解调用哪一类,但在一些较为少用或者复杂的情况下,可能会发现一些特别的情况。这篇文章会针对这些情况进行一些具体的分析,并尝试着把一些疑惑解答分析出来。开发的过程其实是一个思维抽象再实践的过程。这个过程只有一条正确的路,就是用最简单(或者说尽可能简单)的方式来实现功能。所有的编程技巧,其终极的目标只有一个,让功能实现变得容易和安全,让代码更容易维护。
2024-02-07 20:44:00 782
原创 跟我学c++中级篇——列表初始化和折叠表达式的灵活运用
边学习边总结,这其实就是理论和实践结合的一种方式,各人有各人的方法,只要目标是一致的,就可以了。C++的细节还有非常多,这就需要不断的在实际的工程中遇到后真正的深入了解其中的运行机制,然后 才可能灵活的运用。
2024-02-06 09:30:28 277 2
原创 一步一步写线程之六数据通信并发模型Actor和CSP
数据通信模型和多线程编程本身是密不可分的,原则上来讲,谈及多线程编程一般就是要实现多线程之间的通信,否则多线程技术本身并没有什么可讨论的。一个技术其实如何能真得可以深入掌握进去,其实就是一个生态,围绕着它或近或远或紧密或间疏的有着各种各样的其它技术与之互相配合。挨过来一样,在其它的技术上,可能学习的这个技术又是其生态中的一环。明白了吧,你中有我,我中有你,这才最终形成了更广义上的计算机技术。
2024-02-05 22:46:03 603 2
原创 跟我学C++中级篇——STL中decay的应用
std::decay其实在元编程中应用得还是相当多的,毕竟有的时候宁可错杀一千不可放过一个,安全的控制参数类型才是王道。但仍然需要在实际的场景中仔细的分析应用,不能盲目的不加考虑的使用。有兴趣可以对比的看看std::decay,std::decval和decltype,一定会有收获。
2024-02-03 11:02:06 410 2
原创 跟我学C++中级篇——common_type的应用
它的使用比较有意思:1、如果无模板参数,则无类型。即sizeof…(T) 为零,则无成员 type2、如果一个模板参数,则等同于这个类型(std::common_type::type),否则也是无type3、如果有两个模板参数,要找一个可退化到相同的类型,否则无type;如果有自定义物化,则使用该特化;另外对于一些the conditional operator的操作按照相关的标准定义来操作。同时C++20中的新定义参看相关的新标准。
2024-02-02 21:11:16 294 2
原创 DPDK系列之四十一数据收发整体流程源码分析之一整体流程
代码分析比较枯燥,但这又是必不可少的一关,不过不行。古人不是说过,做学问就像翻山,一山方出一山拦。只要坚持下去,就会闯出层峦叠嶂的知识万山。
2024-01-27 19:19:59 449
原创 一步一步写线程之五线程池的模型之二半同步半异步模型
在目前可预见的技术范围内,完全无锁的可能性几乎是零,而且相对于有锁编程,无锁编程的要件有点多,这也导致无锁编程更多的应用于基础层。而且大多的应用场景其实对于效率的敏感性并没有到不可忍受的地步,所以这也是HA/HS应用非常广泛的原因。大家可以看看这篇文章“An Architectural Pattern for Efficient and Well-structured Concurrent I/O”,会有更好的体会心得。
2024-01-27 11:47:29 932
原创 跟我学C++编程中级篇——std::enable_if的使用
对于SFINAE(不清楚的可以翻一下以前的相关文章)开发者来说,std::enable_if是绕不开的一个小话题。在C++11至C++20间,其在模板的元编程中起到了重要的作用。不过在C++20后Cocepts可以实现更清晰更简单的方式。其实非常好理解,这个模板结构体的第一个参数是bool型,第二个默认是个void,就是说,第一个参数决定了是否启用第二个参数。这下就明白了吧。struct T {T(Floating) : m_type(float_t) {} // 错误:无法被重载。
2024-01-23 18:55:17 399
原创 一步一步写线程之五线程池的模型之一领导者追随者模型
学习理论就是学习别人抽象出来的知识,然后再把学习到的知识理论应用到自己的工作中。如此往复循环,慢慢就会对这些知识有了更深刻的理解,也就可以在此基础上自己抽象自己的理论和知识体系来指导自己的实际工作。武林中不是有一句话:“练拳不练功,到老一场空;练功不练拳,到老也枉然!计算技术亦是如此。
2024-01-20 22:45:27 950 2
原创 assert和static_assert及#error的使用
C/C++一直是外人认为的难学的语言,原因提过,就是太灵活。学得灵活,用得灵活,这让许多初学者很难一下子适应过来。其实最简单路就是最基础的方式,把基础打好。侯捷老师的原话:“勿在浮沙筑高台!”,非常贴切。尤其这几年看标准文档,越看越发现,这句话的重要性。配合着侯老师的另外一句话:“源码之前,了无秘密”。就明白了学好C/C++的最简单的方式了,打好基础(多看理论知识),多看代码(多多上机实践)。总结出自己一套学用C/C++的路来。
2024-01-19 21:14:12 417 2
原创 跟我学c++高级篇——基础类型和POD结构体反射
由简入繁,从基本到深入总是需要一个过程,学习反射也是如此。写代码是为了把学习的知识验证一下,同时可以更加深刻的理解知识。开发者们经常遇到这种场景,几行简单的代码,琢磨半天也确定不了什么意思,但是上机一调试,就恍然大悟。这就是侯捷教师的那句话“源码之前,了无秘密”。反射还是有些难度的,所以这个系列会慢慢增加。
2024-01-14 11:22:03 969 2
原创 跟我学c++中级篇——面向切片编程
所有的设计思想和编程模式,都是一种抽象。既然是一种抽象,就意味着从思想的高度来看问题,不能纠结于具体的某个实现细节。思想是一种指导行为的原则,而不是指导行为的行动过程。很多人往往忽视了这一点。所以在对待编程思想和设计思想上,会有两种论调,一种是无用论,不管是看得懂还是装看不懂,觉得这种思想没啥实际作用,不如实际写点代码有用;另外一种是空谈论,坐而论道,不顾实际,觉得写代码特别LOW。正如前面反复强调的,计算机知识是一种高度的理论和实践相结合的知识,理论和实践是一种互相促进互相制约的一种状态。
2024-01-13 08:40:00 1078 5
原创 IQ调制技术
小白入门篇,有错误和不妥欢迎指出,这一系列的重点不是怎么搞这些算法,重点是先知道这些算法是搞啥的或者说弄明白这些算法是什么,怎么来的,有哪些物理意义和实际应用。具体的算法可能会在后期实际用到再进行具体的分析说明。
2024-01-11 10:22:59 451 2
原创 合成孔径技术
合成孔径技术现在也开始从二维向三维扩展。同样,在不同的行业的应用也快速进行中,特别是随着在普通的民用行业的使用,使得合成孔径技术愈发为更多的普通技术人员所熟悉和应用。这就如任何一项科学技术总是从高大上慢慢走向大众化,最后成为一项重要但很普通的应用技术。
2024-01-07 16:59:29 1080 2
原创 一步一步写线程之四简单线程池
写线程池不要着急,要把基础打好,然后多看看网上各路大神对线程池的看法和他们的线程池代码。当然,各种框架中的线程池的代码更有参考作用。多看多写,多探寻原因究竟,更要多引入新技术新知识。这样,线程池自然会写好。写好代码后,还要不断的回头完善和修改自己写的代码,这样,最终就会写出一个不错的线程池。与诸君共勉!
2024-01-07 13:17:37 959
原创 一步一步写线程之三多线程设计开发
多线程的很多情况,其实就是生产者和消费者的问题,这在后面的文章中会在线程模型中进行详细的分析说明。其实正如《倚天屠龙记》中太极拳一样,多线程的设计开发本身就是一种动态开放的方式。没有必须如何如何才可以的绝对性条件,如果有,说明设计一定有问题。学习并掌握多线程的各种知识和设计方法,在实际情况中,综合运用这些技能,有针对性的解决主要应用痛点,这样设计出来的多线程程序,就很可能是当下最合适的。
2023-12-31 22:40:00 461 2
原创 跟我学c++中级篇——再谈C++20中的协程
协程最大特点是它可以跨越线程来进行操作,而在线程中一般数据处理要么在线程中独自控制要么需要加锁。所以协程应用起来更灵活,这也是为什么协程能更好的发挥线程的作用并同时呈现更好异步操作的原因。这个在GO的协程测试中已经有验证,协程可以开出几百万个,但线程一般到几百个就达到瓶颈了。协程的开发会在大多数场景下替代线程的开发,只有一个最大原因,简单,功能强大倒是其次。希望c++中的协程在后面会变得更简单好用。
2023-12-31 00:18:47 1620 3
原创 DPDK系列之四十硬件加速和功能卸载
将整个转发的流程相关内容搞清楚后,再去和代码匹配学习,就会发现学习起来相对容易了很多。其实还是推荐大家多看一下DPDK的官方文档,这样会更准确更清晰。但看官方文档有时对小白确实不是一个很友好的入门的方法。这就需要看一看别人学习和实践的心得了。仁者见仁吧,目的只有一个,学会并能熟练使用DPDK。
2023-12-24 11:09:15 225
原创 一步一步写线程之二线程应用管理
本系列重点是如何写多线程的应用,具体到一些细节的应用,大家需要自己回头多看看相关资料或者书籍资料。如果有一些特别需要说明的,可能会在后面插入一些说明的篇章,但也不会安排在这个应用系列中。也就是说,这里更侧重是对基础知识的应用,在应用前,要把应用的基础点都说明一下。
2023-12-23 12:11:14 76 2
原创 DPDK系列之三十九控制管理
通过前面的分析,对DPDK中对报文处理的过程有了一个初步的认知。从一个更高层次来看,传统的网络通信一般会通过上层应用、操作系统、网卡驱动和硬件四层。再往下,基本就不属于于计算机控制的系统了。早期的应用,基本上这四个层次都比较单纯,所以也没啥复杂的管理方式,你来我往,你应我答这事就成了。可世风不古,上层应用的快速发展,使得底层的压力骤增。软件和硬件的发展是相互影响的,软件新需求的提出,硬件会在一个阶段后满足,即使无法通过正常的技术迭代满足,也可以使用其它方式。
2023-12-17 11:15:44 86 1
原创 跟我学c++高级篇——C++26反射预览
看了c++26中的提案,可以发现其实很多现在的反射框架的轮子基本都可以废弃了。不过,能把反射最终支持,估计得2028年左右了,时间还有的是。喜欢造轮子的同学可以继续造,反正在造轮子的过程中,可以更好的学习反射的原理和实践,同样能更好的理解新标准中的反射。这样,在未来的应用中,也会更加轻松的引入标准库内的反射。在后面反射实现分析讲解中,基本也会沿着大致相同的路线进行。
2023-12-16 20:37:58 296 1
原创 跟我学c++高级篇——静态反射实现之二函数接口实现
不断的抽象实现可以保证设计上的依赖于抽象而不依赖于实现,也就使得代码更有普适性。但多层次的抽象导致的结果可能是代码阅读上的困难和维护上不方便。这个就是仁者见仁了,一般来说,对于库等升级比较正式而且不怎么频繁的项目可以尽量抽象,而对于应用层,抽象要适当。不过在现在的环境下,就根据情况自己选择吧。
2023-12-10 11:05:20 233 2
原创 一步一步写线程之一简单的开始
从简单开始,不忘初心,朝着实际应用不断的前进。多线程编程属于那种入门容易,写好难,精通更难的一种编程技术,真正的生产上,大牛们被憋住当场打脸的情况也不少见。总之一句话,多看书,多实践,多应用。小心写代码,防御性编程,少引入BUG比如事后调试定位要更容易做到一些。
2023-12-09 21:15:49 52
原创 DPDK系列之三十八网卡优化
总之,要想把一个系统优化,从整体上来看,一定不能在某个环节有明显的短板,这和计算机的木桶原理异曲同工。不但如此,这诸多环节中的处理协调也要尽量保持一致,而不能是生产者疯狂的生产,完全不顾消费者的处理。这也是DPDK提供三种处理模式的原因,因场景而异,不能一言而论。能否把DPDK用好,除了软件给力,整体的运维也要跟上。
2023-12-09 08:53:15 123
原创 跟我学c++高级篇——动态反射之二动态列表
在上文说过,本来这篇是和上一篇打算合在一起,可是又觉得它们有点不同的意思,就拆分了开来。其实说来归去,重点是理解如何进行反射前的准备,把相关的字段名称都准备出来,只是同一个基础的应用,却可以在上层写出不同的反射方法来,这也是c++总被称为难的原因。因为其灵活,不容易掌握,而每个方法又有长处和不同的适应场景,这都需要开发者自己权衡,这就是难的原因。见仁见智,各取所需吧。
2023-12-03 12:49:08 176 2
原创 跟我学c++高级篇——动态反射之一遍历
这篇内容就有点接近正常理解的反射的意思了,本来这篇想把一个动态表生成的方式也分析了,但是又觉得太长了,还是分到下一篇再一起分享。慢慢来,不要急。
2023-12-02 19:00:55 167 1
大数阶乘算法的一个例子
2018-10-06
朗新WEBSERVER接口(南网和天津电网)
2009-03-16
AndroidStudio使用NDK生成静态库的方法?
2015-08-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人