美文网首页程序员
C++ 20的悲哀,还未出世就被群嘲“劝退”

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

作者: Python编程导师 | 来源:发表于2019-03-09 21:17 被阅读4次

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

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


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

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

 毕达哥拉斯三元数组,C ++ 20 Ranges 风格

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

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

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

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

我们可以编译这段代码: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()的计时器精度下)。

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

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

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

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

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

一是编译时间;

二是运行时性能。

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

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

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

用 C ++:

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

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

相关文章

网友评论

    本文标题:C++ 20的悲哀,还未出世就被群嘲“劝退”

    本文链接:https://www.haomeiwen.com/subject/kriepqtx.html