博观而约取,厚积而薄发 立场决定观点,眼光决定深度 道不辩不透,理不说不明
分类: IT职场
2009-10-15 09:20:27
这篇文章引来了很多更愿意选择C而不是C++的读者的评论。我不是很同意其中的几点看法,在此做一个简要的阐述。
一位读者写道,“作为消遣,你不妨可以看看Linus Torvalds是如何考虑C和C++的。”我认为,阅读Torvalds的文章确实很有趣,如果你喜欢读书的话。但对于我并不是乐趣。这种挑衅并没有很好的基础,正如我的朋友兼同事Steve Dewhurst所解释的那样。Torvalds为计算机行业做出过很多积极的贡献,但这句话我认为不是。
另一位读者写道,“我已经学习过C,但是从未专业地使用它,而且我觉得学的越多,我就越认为它不适用于嵌入式应用。这不仅仅是因为它在资源方面花费很大,同时它甚至鼓励人们去做冒险的事情。在使用C语言做一些动态分配和递归算法时比较糟糕,但是C++可以很好的实现它,尽管你并不是很了解其内在。”
我使用C++进行的原型开发,并为其他使用C++进行开发产品系统的人们提供过咨询。我使用C++越多,我就会看到它越有用,越会坚定的认为C++要比C好多了。
不是鼓励冒险行为,相反,很多C++语言,如类、访问控制、构造、析构函数、引用以及超载等-都需要符合更为严格的检查才能工作,相较于C的高风险,C++将更加稳妥。尽管我也同意通常情况下,C++的都有些大,因此会增加一些费用(10-15%)。但我觉得没什么问题,尤其是调整时间的关键代码,如中断处理,比C更有效。
据我所知,不存在C++执行动态分配或幕后进行递归运算。事实上,你的代码可能会调用一个执行动态分配或递归的函数,这对于C++而言不再是问题了。C++支持简单的编译和链接技术,从而阻止使用刚才提到的动态分配。
另一位读者写道,“私有封装(private encapsulation)是对象导向(object orientation)的唯一部分,也是嵌入式系统必须拥有的重要内容。C可以通过静态变量来很好地支持文件的声明部分。”
我同意第一句话,但我不会用这么强烈的字眼。我认为C++的最有用的单一功能是可以私人访问控制的类,这是C所没有的。你可以使用类来编写出更好的嵌入式代码。至少对我来说,没有使用类,我是不会去编写代码。
另一方面,我不同意C支持访问控制“通过很好地使用静态变量在文件的声明部分”。我认为,读者常用的技术包括:
我所指的这些技术是通过独立汇编来进行封装的。它可以“很好”的工作,只要你可以接受以下情况:
C++类没有这些限制。
还是这位读者补充道,“初始化不是你想要的,实际上,处于安全考虑,你会希望避免出现这种情况,从而减少开启时间”。
我坚决反对这种说法。构造初始化是可取的。我认为第二个有用的就是C++构造函数和析构函数。未能正确初始化的对象很可能存在安全问题,而构造大大确保了正常初始化的可能。我很希望看到具体例子来说明构造函数如何导致安全问题。《使用C和C++进行安全编码》(2005, Addison-Wesley出版社) 的作者Robert Secord也希望看到。
如果你关心启动时间,C++提供了“重新安排”的功能来为你提供了更多的对构造执行的控制。你可以推迟在系统启动后进行初始化。我希望在不久的未来能做到这一点。
尽管我宣传C++要好于C,但我必须承认,很多读者有理由使用C,正如缺乏与预期目标的平台相适当的C++编译器。我将继续写关于C和C++程序员感兴趣的文章,也想说明你所选择的编程语言是明智的。
在我写完这篇文章和真正被发表之间,Michael Barr专栏中的读者陆续来追问我构造是否会导致安全问题。原来提出这个问题的读者,解释为,这个问题“不是因为语言,而是因为内存可不可靠。可能初始化的时间点只是几天,几周甚至几年都在使用变量。如果你依赖初始值,你就需要远离内存商所作出的安全承诺。”在我看来,他所描述的问题,他自己也承认与构造无关。我仍然看不到安全因素是出自于构造本身。
作者:Dan Saks是Saks & Associates的总裁,该公司主要从事C/C++的培训和咨询。