Chinaunix首页 | 论坛 | 博客
  • 博客访问: 327409
  • 博文数量: 83
  • 博客积分: 2363
  • 博客等级: 大尉
  • 技术积分: 655
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 11:15
个人简介

博观而约取,厚积而薄发 立场决定观点,眼光决定深度 道不辩不透,理不说不明

文章分类
文章存档

2015年(6)

2014年(7)

2013年(8)

2012年(11)

2011年(7)

2010年(9)

2009年(35)

我的朋友

分类: IT职场

2009-10-15 09:20:27

  我的同事Michael Barr在本月初写过一段有趣的文章,题目为“嵌入式编程感想:会用C语言的是真男人!”。我不想总结该文章的内容——如果你感兴趣可以自己去阅读:http://blog.chinaunix.net/u2/72362/showart_2027034.html。

这篇文章引来了很多更愿意选择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++的培训和咨询。

  • 阅读(753) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~