赞同那个Linus,孟岩,云风的关于 C vs C++ 的观点(原来发布在校内网的文章回复里)

 

孟岩和云风的话说得更加中肯,用C++有比较重的思想包袱,这个我有体会,一点也不假。比如我用OpenCV库(Intel的,做人脸识别的),做了一个C++ Wrapper,其结果是,我80%的时间都花在了如何管理内存的上。比如 operator * 运算符,你得返回一个包含运算结果的矩阵,但是这个矩阵应该存放在哪?1. 栈。坏主意,当 operator * 返回时,你存储的东西已经指向了不可靠的地方。我做过实验,如果在 operator * 中加入一个printf(),可以正常返回,否则不可以。这个是很垃圾的想法。 2. 堆。这个是用C++ operator new 的朋友们的第一想法。但是我问你,谁来释放这块空间? operator * 已经返回,所以它肯定管不了。调用者?那更加不可靠,比如你用A * B,而不是C = A * B,那么内存不就泄漏了。当然你说前一种没有意义,对,但是如果是连乘呢,如A * B * C * D,你还那么自信吗因为后一个 operator * 的输入其实是一块堆中的值,那么 operator * 还要管理内存,你放心? 3. 静态存储区。这个想法好,我很喜欢,可以解决上面所有的问题,但是,你想过没,多线程时,你是不是还要给这个 static 上锁?呵呵, operator * 本来就是可以直接并发的,结果你现在限制了并发能力,根据 Adam 定律,并发被你毁了。说了半天,还是 cvMul 好,你问这是什么,呵呵,这个是默认的 C 风格的相乘的函数,我们就是在包装它。 

一直也在思考这个问题,自从学了 C++,编程时满脑子的模板和 STL 范式,结果根本没有考虑自己的程序的主要功能。不过话说回来,C++ 有几个你最好要用的优点,这个在 Visual C++ 2005(其实其它的 IDE 只要有 Code Complete 的也可以):

1. 将 enum 包装到类里或者名字空间中,这样你只要输入“SomeClass::”就有提示了,很爽,而且是不会污染全局名字空间的。我在写 DirectX 的时候就很想包装,应为它的名字都太烂了,结果 MS 直接用了 enum { ... } SomeName;的形式,结果我改不了,郁闷。

2. RIAA。这个东西更好,当你从某个函数退出时又忘了释放资源(不仅仅是内存资源),这个可以帮你大忙。

3. STL 的部分。STL 的容器类虽然好,但是其行为有一次不知道为什么很出乎意料,所以不爽。另外,C++ 模板的行为像宏,所以使用时肯定不会有 C# 基于接口的模板的强大的 Code Complete 支持。

4. OBP(Object-based Programming)。注意,不是 OOP。看到文章的如果有 OOP 的死忠请放过我,不要找我辩论,我没兴趣也没实力。我写的是带有很重的 Computation 色彩的程序,不是你们的 java Business Solution,我只是给工科的同学建议。GTK 其实是OBP的,他的函数都是“g_模块名_函数名(对象,其他操作)”这个格式的。代码可能写的不好吧。我本来想用的,结果发现不支持 wchar_t,那只能算了。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页