“越来越像新语言的 C++,我与它结缘、痴迷、深耕的 14 年!”

ormpp 项目新版本规划概述 ormpp 项目新版本规划概述 首先感谢大家对purecpp社区一直以来的支持,我们在努力的为大家提供更好的面向现代的c++组件库。 此次ormpp项目更新不仅仅是ormpp这个项目的功能性和易用性升级,同时也是purecpp社区代码组织模式进化的一次尝试。我们想将之前分散的组织形式,升级为更加易于使用,更加紧凑的模式。 使用过boost库的小伙伴都知道,boost库是高度灵活配置的,可以根据用户自己的选择去使用header only的形式,或是静态链接库的形式,甚至于可以编译成动态链接库的形式来使用。我 阅读详情

【优快云 编者按】提到C++,不少人会想起Linus吐槽其是一门糟糕的编程语言,也有人觉得不断发版的C++,越来越像一门“新”语言。

本文主人公祁宇从事C++开发工作已有14年,从结缘再到一头扎进去深耕,对C++的兴趣和热爱随着版本的更迭代有增无减。在《新程序员004》的“我是程序员”专题中,祁宇回顾了自己与C++结缘、痴迷其中一路深耕的故事。这既是他的程序人生,也是C++的发展演进历程。

作者 | 祁宇       责编 | 张红月

出品 | 《新程序员》

祁宇,purecpp社区发起人,《深入应用C++11》作者,开源库rest_rpc、cinatra、iguana、Feather、ormpp作者。热爱开源和现代C++,乐于研究和分享技术。

缘起C++11

2008年我毕业后第一份工作就是C++开发,那时候是经典C++98/03标准,C++新标准还没有出来。而我对C++谈不上热爱,甚至相比之下,觉得C#用起来比C++要舒服得多,比如C#有GC(Garbage Collector)机制,没有内存泄漏的烦恼;有Lambda,代码也很简洁,不像C++那样需要定义函数对象;C#还有线程和锁,而C++多线程还只能用系统API,导致写跨平台程序很麻烦……诸多问题。

在我写了三年C++代码后,ß∂C++的一个里程碑——C++11诞生了。C++11提供的新特性有一百多项,让人眼花缭乱。C++11解决了之前C++98/03的大部分问题,比如用智能指针避免内存泄漏,Lambda摆脱了函数对象,std::bind统一了之前的bind1st、bind2nd,提供了线程库和锁,还有魔法般的可变模版参数等等。总之,C++11让C++焕然一新,变得很“现代”了,正如C++之父Bjarne Stroustrup所言:“C++11看起来像一门新的语言。”

C++11相比C#、Java等其他语言,从易用性角度来说已经毫不逊色了。而我也被这些新特性深深地吸引住,乐此不疲地研究和实践它们。在这个过程中,我对现代C++的兴趣被激发出来,第一次发现原来它的世界里有这么多好用又有趣的东西。

比如,C++11可变模版参数,对参数做了泛化,表示任意类型和任意个数的参数,这是C++11之前没有的。那么,该如何解析可变模版参数包里的参数呢?一种经典的写法是通过模版递归来实现。

void print(){}
template<typename T>
void print(T t)
{
 cout << t << endl;
}
template<typename T, typename... Args>
void print(T t, Args... args)
{
 print(t);
 print(args...);
}
int main() {
 print(1);
 print(1, 2);
 print(1, 2, 3);
}

这种解析方法比较繁琐,需要定义递归开始和递归终止函数。当时我看到了另一种有些怪异的展开方法,惊呆了!


template<typename... Args>
void print(Args... args)
{
 std::initializer_list<int>{([&]{cout << args 
<< endl; }(), 0)...};
}

我觉得这个写法看不懂,看了好久都没有看懂,查阅了一些资料后才恍然大悟。原来这种方法是借助初始化列表和逗号表达式来展开参数包,具体来说就是在生成初始化列表的过程中展开参数包,这个initializer_list数组是完全无用的,最终的元素都是0,它仅仅是一个帮助展开参数包的“工具人”。这种写法实在太巧妙了,也不知道是谁想出来的。

除此之外,C++还有很多有趣的黑魔法,比如借助SFINAE(模版替换失败不是一个错误)可以在编译期检查某个方法是否存在,如果存在就调用,不存在则忽略。这在其他语言里是无法实现的,正是这些好玩又很酷的东西强烈地吸引了我。

当然,也有很多人吐槽这些是让人费解的C++奇技淫巧,殊不知这些技巧在开发库的时候往往能化腐朽为神奇,优雅地解决问题,甚至在后面的C++14和C++17里已经变成常规写法了。再回过头来看,有种“旧时王谢堂前燕,飞入寻常百姓家”的感觉,这也证明C++是一门历史悠久、不断发展和充满活力的语言。

在2012—2014年期间,我花了大量时间去研究C++11,并用于工作当中,平时也会把对于C++11新特性的一些心得放到博客上分享出来。初衷很简单,我希望将C++11的好东西分享出来,让更多人了解和使用。这些文章很受欢迎,也让我体会到了技术分享的乐趣,从此一发不可收拾。

忽然有一天,冒出了写一本C++11书的想法,当时介绍C++11的书很少,我相信有很多人希望有一本书来讲解如何在实际开发中使用C++11。这是很有意义的一件事,于是我下定决心开始写书。在业余时间写书是一件苦差事,经常要熬夜到很晚,忍受孤独与枯燥,中途差点放弃,不过最终坚持下来,历时8个月写完,《深入应用C++11》在2015年出版,至今已经印刷12次了。很庆幸我能坚持把书写完,而对于C++的兴趣和热爱才是我坚持下去的动力。

所以,能发现并追寻自己的兴趣是一件难得的事。当你对一件事有着强烈的兴趣时,学习、研究和掌握它也是一件简单的事。

我经常跟一些C++新人讲学习C++的经验和方法最重要的是兴趣,如果仅仅把它当作一个工具,感受不到它带来的乐趣,是不容易掌握好它的。如果不是C++11让我感受到现代C++之美,感受到现代C++的魅力,我可能也找不到自己的人生乐趣,感谢C++11!也许这就是我和现代C++的缘分。

本文节选自《新程序员004》纸刊+电子刊同步上市

创建现代C++开源社区

现代C++虽然在语言层面的开发效率不逊于其他语言,但在基础库方面就差太多了。在2014年,C++连个像样的HTTP库都没有,而这在Java、C#等语言中早就有了。正是这些基础库的缺失,极大地阻碍了C++的开发效率。出于对C++的热爱,我希望能开发很多实用的基础库来完善它的生态圈。于是在众多粉丝的支持下,2015年我决定成立一个现代C++开源社区——purecpp.org。在社区中开发C++基础库,期望来提升C++开发效率。我陆续开发了HTTP库cinatra、RPC库rest_rpc、序列化库iguana、ORM库ormpp、Web框架Feather等等,后来还在GitHub上创建了purecpp-org项目列表,把社区里的优秀开源项目聚合起来,便于C++开发者选择。

完善C++生态圈,让更多人用上好的C++基础库,这是我创办C++开源社区的初衷。也欣喜地看到社区开源项目被越来越多的公司采用,比如cinatra已经有十几家公司实名使用;rest_rpc被博世汽车车联网团队使用,已经跑在数百台汽车的嵌入式系统中;一些券商在使用ormpp访问数据库等等。

purecpp是一个很纯粹的C++社区,创办至今没有做任何的商业化,连广告都没有,专注于C++新技术分享和C++开源项目。从2018年开始,每年都会组织Pure C++大会,大会都是免费的,相关费用主要靠赞助,有时候是自己出资解决,社区大会也得到了很多热心朋友的帮助与支持,正所谓“C++不孤,必有邻”!

C++新标准与技术创新

有很多人对C++新标准不“感冒”,对新技术也持怀疑态度,甚至认为C++新标准不过是加了一些语法糖而已,认为新标准的一些写法是奇技淫巧,这其实是非常大的误解。诚然,C++新标准确实引入了一些语法糖来简化代码的编写,但更多是弥补了语言上的一些缺失,提高C++的易用性,提升安全性和性能,甚至改变编程理念。

一个典型的例子就是constexpr特性,它是在C++11中被引入的,用作编译期计算。通过它,可以用很简单的方式实现编译期计算,不用再像以前一样需要通过模版元编程来实现,使用难度大大降低。

以一个编译期计算阶乘的例子来展示constexpr的作用,通过图1我们可以看到,在C++98/03中,需要通过模版递归来实现编译期计算,代码比较晦涩。而在C++11中可以直接通过一个constexpr函数来实现编译期计算,即用constexpr函数来实现非模版的编译期计算。这个函数除了声明为constexpr外和编写一个普通函数没什么区别,这样就大大降低了编译期计算的难度。

图1 编译期计算阶乘示例对比

不过,C++11中constexpr函数存在一些约束,它的函数体只能是一个表达式,不能定义变量,不能有循环语句等。在C++14中消除了这些约束,允许定义变量、允许有循环,让constexpr函数真正和普通函数的写法无异。

所以,C++14让constexpr的易用性得到了提升。

我在2021年Pure C++大会上讲过如何使用constexpr编译期计算来提升程序性能,当时分享的一个用constexpr做性能优化的案例,通过constexpr编译期计算将程序性能提升了三十多倍。

管中窥豹,从constexpr这个新特性可以看到C++新标准演进的一个重要趋势:让C++变得更加容易,性能更好。

正如purecpp社区的Slogan“Newer is Better!”我非常推崇使用C++新标准和新技术,因为C++新标准带来的新技术往往会促进技术创新,技术创新带来改变。我在2020年Pure C++大会上介绍了一种新的插件化开发方法,就是通过C++的新技术解决以前经典的C++插件化开发中插件需要派生于某个固定接口的问题。新的插件化方法完全摆脱了继承的约束,可以自由地在插件中写任意方法,这种新技术已经用在开源项目Ray当中了。

关于C++新标准带来的技术创新另外一个典型的例子就是编译期反射,我近期做了一些技术验证,基于C++20实现的编译期反射序列化库的性能是ProtoBuf和Msgpack的十几倍,这个测试结果让我有些吃惊。没想到原来基于编译期反射的序列化性能可以超越被广泛使用的序列化库这么多,这就是C++新标准技术创新的威力!

如果说C++11是C++的一个里程碑,那么C++20就是现代C++的一个里程碑。因为它引入了非常重要的几个特性,而这将改变C++的编程理念和模型,当然也让C++变得更加好用,比如Concepts、Modules、Coroutine、Ranges等。以协程(Coroutine)为例,它可以让我们用同步方式写异步代码,彻底摆脱了回调地狱(Callback Hell),异步回调模型将被协程代替。用C++20新标准,失去的是弯弯绕绕的Callback,得到的是简单直接的协程。协程让异步变得简单,在未来3~5年,C++网络库的协程化将是大势所趋。

Modules让我们不用再引入include头文件了,而是像其他语言一样使用import库就好,同时它还会大大提升编译速度。我们做过一个测试,将async_simple[2] 模块化后,编译速度提升了45%,性能也略有提升。ModulesABI相关的工作也正在做,可以说,Modules带来了C++统一包管理的曙光。

C++2a带来的使命感

C++新标准的演进速度比较快,从C++11开始保持着三年一个版本的迭代速度,后面还有C++23/26/29。而未来C++标准将提供更多好东西,比如Executors、Networking、编译期反射等。虽然新标准推出比较快,但基于新标准的库却跟不上,比如协程库,目前除了async_simple外,能用的无栈协程库几乎没有,这也是C++的遗留问题。

想象一下,如果把协程、编译期反射、Executors结合起来开发一些高性能易用的网络库,那是多么有意义的一件事!我也正在做这方面的工作,希望能尽早推出到C++开源社区当中。

研究C++2a新标准、新技术及其应用场景,创造符合应用需求的基础库让我有一种使命感,我会和C++社区的朋友们一起继续努力推出更多实用的、基于C++新标准的基础库给C++开发者使用,完善C++生态圈。


深入应用C++11代码优化与工程级应用.pdf 深入应用C++11代码优化与工程级应用.带书签。完美 立即下载

相关推荐

深入应用C++11 代码优化与工程级应用.pdf

祁宇 深入应用C++11 代码优化与工程级应用.pdf

专访图书作者祁宇:C++11让程序更简洁、更现代、更强大

日前优快云采访了祁宇,请他解读C++11的新标准、C++的现状以及未来的发展前景。  优快云:怎么会想到编写《深入应用C++11:代码优化与工程级应用》这本书的?有没有什么故事可以分享下? 祁宇:我作为比较早使用C++11的开发者,在项目中应用C++11的时候,可以查阅的资料还很有限,主要是通过ISO标准(ISO/IEC 14882:2011),维基百科、MSDN和http://en....

weixin_33670713的博客 413

混沌系统在图像加密中的应用(二维离散Hénon混沌映射)

Hénon映射是一种二维离散时间动力系统,由美国数学家Michel Hénon在1976年引入。它是混沌动力系统中的经典模型之一,具有简单的形式和复杂的行为。

weixin_42207434的博客 2490

现代C++函数式编程

作者简介:祁宇,武汉烽火云创软件技术有限公司研发中心技术总监,《深入应用C++11》作者,C++开源社区purecpp.org创始人,致力于C++11的应用、研究和推广。乐于研究和分享技术,爱好C++,爱好开源。 导读:本文作者从介绍函数式编程的概念入手,分析了函数式编程的表现形式和特性,最终通过现代C++的新特性以及一些模板云技巧实现了一个非常灵活的pipeline,展示了现代C++...

ctrigger的专栏 753

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。分别对LANDSAT 5/7/8系列数据计算FVC,其中Landsat5 和Landsat 7NDVI计算利用 B4和B3波段,Landsat8 和Landsat9 NDVI计算利用 B5和B4波段。算法从当年所有观测数据中,以低云、低探测角度和最高NDVI值为标准,选择最佳的可用像元值,并进行换算。(3) FVC的计算。

地球资源数据云的官方博客 1809

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 297

我爱c++

<br />开学就大三了,自己一直很喜欢编程,对vc++也很热爱,最近跟着老师后面希望可以学点东西,可是老师那边都是用c#的,学了一个多星期的cs,能算勉强入门,可是最近有没有什么事情做了,就在网络随便看了看,发现vc并不是过时,通常情况下c++程序员要比c#工资高好多,当然是学的好了。所以自己现在下定决心了,要c++方向努力。<br /> 

wl531716369的专栏 644

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 495

C++20协程原理和应用

C++ 资深技术专家祁宇立足于 C++20 使用的无栈协程标准,以具体示例分享协程的具体应用实践与经验。

优快云资讯 1万+

从零到一:基于STM32F103C8T6与HAL库的磁悬浮电赛装置实战解析

本文详细解析了基于STM32F103C8T6微控制器与HAL库,从零构建磁悬浮装置的完整实战方案。文章深入剖析了硬件设计中的线圈布局与“反向串联”巧思,以节省PWM资源;并阐述了采用三闭环PID控制算法的软件实现,结合Keil开发环境与HAL库进行工程搭建与调试。该方案为电子设计竞赛(电赛)提供了高可行性的参考,是嵌入式软硬件综合实践的优秀范例。

weixin_29169505的博客 276

Python 控制 Keysight N9010B/N9020/N9030 频谱仪

为什么要实现频谱仪的控制呢?起因是因为我司RF的同事们需要对通信模块进行GSM的带内杂散进行测试,由于该测试的频点涉及900多个,所以急需开发一款自动化测试工具。该工具需同时实现对无线通讯仪和频谱仪的控制,这篇文章主要介绍一下频谱仪的控制!做通信的应该对频谱仪都不陌生,不过我之前做的都是软件相关行业,所以我对频谱仪其实还是很陌生的;不过好在我的同时们都很热心,加上仪器的文档,一段时间下来,也算是熟悉了一些。

xgh1951的博客 1万+

c++开源协程库libgo介绍及使用

​协程这个概念,最近这几年可是相当地流行了。尤其 go 语言问世之后,内置的协程特性,完全屏蔽了操作系统线程的复杂细节。甚至使 go 开发者“只知有协程,不知有线程”了。当然 C++也有高性能的协程库,比如我了解到的微信团队的libco、魅族的libgo、以及libcopp,开源libaco、boostcoroutine,cppcoro。阿里的基于c++20特性封装好用的雅兰亭库。

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 9096

AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研

在当今的人工智能时代,大模型技术的迅猛发展为各行各业带来了前所未有的变革。这些大模型,以其强大的语言理解和生成能力,正在逐步成为智能化应用的核心。然而,如何高效地利用这些大模型,构建出满足各种需求的应用,仍然是一个具有挑战性的问题。DB-GPT,作为一个开源的AI原生数据应用开发框架,应运而生,旨在简化大模型应用的开发过程,让构建智能化应用变得触手可及。本文将深入介绍DB-GPT的核心功能、关键特性,并通过实战操作,展示如何利用DB-GPT进行数据应用开发。DB-GPT是一个开源的AI原生数据应用开发框架。

寻道AI,探索AI无限可能! 1万+

从大佬那里转来的播客

pod 类型编译期反射 反射是一种根据元数据来获取类内部信息的机制,通过元数据就可以获取对象的字段和方法等信息。C# 和 Java 的反射机制都是通过获取对象的元数据来实现的。反射可以用于依赖注入、ORM 对象-实体映射、序列化和反序列化等与对象本身信息密切相关的领域。比如 Java 的 Spring 框架,其依赖注入的基础是建立在反射的基础之上的,可以根据元数据获取类型的信息并动态创建对象。OR...

elegantlemon的博客 179

YOLOv11改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv11目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 3602

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

现代 c++ 一:c++11 ~ c++23 新特性汇总

c++11,c++14,c++17,c++20, c++23 的新特性汇总

antsmall的专栏 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++ RPC ORM 高速解析

/如果是W+ 这里文件被清空的影响。

一个大佬的博客 2225

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

探秘ORMpp:简化现代C++数据库编程的秘密武器

探秘ORMpp:简化现代C++数据库编程的秘密武器 ormpp modern C++ ORM, C++17, support mysql, postgresql,sqlite 项目地址: https://gitcode.com/gh_mirrors/or/ormp...

gitblog_00046的博客 1398

purecpp社区开源项目教程

purecpp社区开源项目教程 1. 项目介绍 purecpp社区开源项目列表是一个汇集了多个高质量C++开源项目的集合。这些项目涵盖了从高性能RPC库、HTTP框架到序列化引擎、ORM库等多个领域。每个项目都旨在提供现代C++的最佳实践,帮助开发者更高效地构建跨平台应用。 2. 项目快速启动 2.1 环境准备 在开始之前,请确保你的开发环境已经安装了以下工具: 支持C++11及以上版本的编译器...

gitblog_00702的博客 1320

C/C++/rust常用开源库总结

C++相关技术学习文档。

喜欢打篮球的普通人 4013

C++入门基础

再者,我们之前学习的顺序表,在尾插顺序表的时候,我们需要定义一个单个节点的指针,也就是一个结构体的指针,在尾插接口中,我们想要改变这个结构体的指针,就要传结构体指针的地址,并且用结构体的二级指针接收,这样才能通过形参改变外面的实参。这里是c++的IO流,其中的<<在这里是"流插入”,endl是换行,是end line的缩写。定义,在使用空值的指针时,都不可避免的会遇到⼀些麻烦,本想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,调用了f(int x),因此与程序的初衷相悖。

2401_84337795的博客 1461

为什么看到这么多人不推荐C++?_c++越来越臃肿(1),2024年最新2024年Golang工作或更难找

能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

2401_84264429的博客 1069

C++实现的ORM映射工具类介绍(三)

================================================================DBMapping类:class DBMapping{private: map *pTableMap; void delTabPtrFromMap(map *pMap);public: DBMapping(); ~DBMapping(); void addTabl

bingfox的专栏 1497

C++与C#的对比

C++与C#的简单对比。来自从c++转C#的开发人员笔记。

qq_25231249的博客 3285
上一篇: 与智能汽车相见恨晚的SOA到底是什么?
下一篇: 对话 MySQL 之父 Monty:超越 MySQL 很难,但我做到了!
评论 22
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值