C++ 20的悲哀,还未出世就被群嘲“劝退”

为了 C++20,C++ 标准委员会曾举办历史上规模最大的一次会议(180 人参会),试图通过会议确定哪些特性可以加入新版本,我们也已经看到媒体爆料的部分新特性,比如 Concepts、Ranges、Modules、Coroutimes 等,但大部分开发人员并不认可此次调整,并将部分新特性归结为“语法糖”。

这是小编准备的C++学习资料,加小编学习群:825414254,加群即可获取哦!

C++ 20的悲哀,还未出世就被群嘲“劝退”_第1张图片

C++ 20的悲哀,还未出世就被群嘲“劝退”_第2张图片

不少网友看到上述特性纷纷在社交平台吐槽,表示不看好 C++20 版本的发布:

C++ 20的悲哀,还未出世就被群嘲“劝退”_第3张图片

不仅国内如此,国外的一位游戏领域开发人员接连在社交平台发表看法,声明自己不看好 C++20 的新特性,并认为新版本没有解决最关键的问题,他通过使用毕达哥拉斯三元数组示例对 C++20 标准下的代码和旧版本进行对比,明确阐述自己对于 C++20 的态度。

以下是 C++20 标准下代码的完整示例(超长预警):

C++ 20的悲哀,还未出世就被群嘲“劝退”_第4张图片

C++ 20的悲哀,还未出世就被群嘲“劝退”_第5张图片

以下代码为简单的 C 函数打印第一个 N Pythagorean Triples:

C++ 20的悲哀,还未出世就被群嘲“劝退”_第6张图片

如果不必修改或重用此代码,那么一切都没问题。 但是,如果不想打印而是将三元数组绘制成三角形或者想在其中一个数字达到 100 时立即停止整个算法,应该怎么办呢?

以下是旧版本的 C++ 代码实现打印前 100 个三元数组的完整程序: 

C++ 20的悲哀,还未出世就被群嘲“劝退”_第7张图片

我们可以编译这段代码:clang simplest.cpp -o outsimplest,需要花费 0.064 秒,产生 8480 字节可执行文件,在 2 毫秒内运行并打印数字(使用的电脑是 2018 MacBookPro,Core i9 2.9GHz,Xcode 10 clang):

 

(3,4,5)

(6,8,10)

(5,12,13)

(9,12,15)

(8,15,17)

(12,16,20)

(7,24,25)

(15,20,25)

(10,24,26)

...

(65,156,169)

(119,120,169)

(26,168,170)

这是 Debug 版本的构建,优化的 Release 版本构建:clang simplest.cpp -o outsimplest -O2,编译花费 0.071 秒,生成相同大小(8480b)的可执行文件,并在 0ms 内运行(在 clock()的计时器精度下)。

接下来,对上述代码进行改进,加入代码调用并返回下一个三元数组,代码如下:

C++ 20的悲哀,还未出世就被群嘲“劝退”_第8张图片

这几乎在同一时间编译和运行完成,Debug 版本文件变大 168 字节,Release 版本文件大小相同。此示例编写了 pytriples 结构,每次调用 next() 都会跳到下一个有效三元组,调用者可随意做任何事情,此处只调用一百次,每次打印三联。

虽然实现的功能等同于三重嵌套 for 循环,但 C++ 20 标准下的代码让人感觉不是很清楚,无法立即读懂程序逻辑。如果 C ++ 有类似 coroutine 的概念,就可能实现三元组生成器,并且和原始的 for 循环嵌套一样清晰:

C++ 20的悲哀,还未出世就被群嘲“劝退”_第9张图片

C ++20 Ranges 会让整段代码更加清晰吗?结果如下: 

C++ 20的悲哀,还未出世就被群嘲“劝退”_第10张图片

多次 return 实在是让人感觉很奇怪,这或许不应该成为好语法的标准。

 

如果谈到 C++ 的问题,至少有两个:

一是编译时间;

二是运行时性能。

虽然 C++ 20 Ranges 还未正式发布,但本文使用了它的近似版,即 isrange-v3(由 Eric Niebler 编写),并编译了规范的“Pythagorean Triples with C ++ Ranges”示例:

 C++ 20的悲哀,还未出世就被群嘲“劝退”_第11张图片

 这里简要介绍 C#中“毕达哥拉斯三元数组”实现,以下是完整 C#源代码:

C++ 20的悲哀,还未出世就被群嘲“劝退”_第12张图片

就个人而言,C#可读性较高:

C++ 20的悲哀,还未出世就被群嘲“劝退”_第13张图片 

用 C ++: 

C++ 20的悲哀,还未出世就被群嘲“劝退”_第14张图片

C#LINQ 的另一种“数据库较少”的形式: 

C++ 20的悲哀,还未出世就被群嘲“劝退”_第15张图片

在 Mac 上编译这段代码,需要使用 Mono 编译器(本身是用 C#编写的),版本 5.16。mcs Linq.cs 需要 0.20 秒。相比之下,编译等效的简单 C#版本需要 0.17 秒。LINQ 样式为编译器创建了额外的 0.03 秒。但是,C ++ 却创造了额外的 3 秒。

一般来说,我们会试图避免大部分 STL,使用自己的容器,哈希表使用开放寻址代替...... 甚至不需要标准库的大部分功能。但是,难免需要时间说服每一位新员工(尤其是应届生),因为 C++20 被称为现代 C ++,很多新员工认为“新一定就是好”,其实并不是这样。

 

你可能感兴趣的:(C语言,计算机,C++,c/c++,互联网,编程)