C++ 的一些新感想

因为在工作中C++用的比较多,听说 C++ 17 最近又引入了很多新特性,就买了几本 C++ 的书回来看。看了一阵,感慨颇多,罗列如下:

  • C++ 在 Library 开发人员和普通使用人员之间的鸿沟是越来越大了。新增加的很多特性都是给Library作者提供的,普通用户平时根本用不到。特别的,我以前总是以为所谓 Library 就是在语言之上提供一些包装好的功能模块,现在看到标准库中很多 Type Traits (比如 is_trivially_destructible) 都需要编译器的特殊支持才能实现,远远地超出了我以前的理解范畴。一般的 C++ 用户,如果打开标准库里面的程序想要研究一下某个特性是如何实现的,多半和天书一样看不懂。
  • C++ 现在的救命稻草就是运行时刻的性能了,这集中体现在C++为程序员提供的内存控制上。为此 C++ 几乎牺牲了其他可能的前进方向,并且不惜在语言上增加了巨大的复杂性。C++ 的创始人 Bjarne Stroustrup 前些年还提要在 C++ 中引入自动内存管理,现在是绝口不提了,估计搞出来也没有人用;为了更有效的支持大型对象,C++ 搞出来 Rvalue Reference 和 Move Constructor,让我这样的 C++ 的老鸟程序员也感到太过复杂;更不用提新的 std::string_view,本身大概唯一的作用就是在大字符串上搞一些子串操作比较有效率,结果强行塞进标准库,连 C++ 的资深作者 Nicolai M. Josuttis 都看不下去,在他的书中大声疾呼:string_view is considered harmful! 即便如此追求性能,看着 Programming Language Popularity Trend 上面 C++ 日渐下滑的曲线,我估计日后 C++ 也就只能守着高性能计算这块阵地了。
  • C++ 现在把编译时刻多态搞得很深,这一点其实和 C++ 把性能作为卖点也息息相关。原本是一个编译时刻模板替换的简单玩意,后来发现这个东西因为没有 Virtual table lookup 从而不损失运行时刻的效率,结果在这个方向上一发不可收拾,各种 type traits 如野草般生长,Library 全部都是模板库,里面根据用户提供的类型各种模板特化层出不穷,对于一般的 C++ 程序员来说根本就是天书,唯一的好处就是运行时刻生成的代码都是直接针对用户提供的类型操作的,效率很高。这方面C++阵营一直使用的例子就是 std::sort vs qsort from C。不过在我看来,最初的简单模板替换就已经完成了 90% 的工作,后来加上的一大堆特性,最多不过使得这个编译时刻多态(现在都叫 meta programming了,据称在 Type Domain 还是 Turing Complete)能够在其他 10% 的场合使用一下,实在算是事倍功半的一个好例子吧。

自己呢,还是好好的搞自己的数学,统计,概率,算法等等。这类语言的东西实在不值得深究啊。