在接触过不少在写 Embedded Linux Firmware 的工程师、他们的开发只用 C Language、也只建议用 C 来开发。 此举并非错误而且出发点是C比C++节省资源、当然还有另一个前题是写的很好的C、所以如果让资浅的工程师来开发那结果会是如何、我想大家可想而知?
在 C++ 光有Constructor跟 Destructor 就可以避开很多程式的烦琐的 initialize 及 memory leak 的问题、再加上用上了Smart Pointer要memory leak除了误用大概就很难发生了。 C++的好处我应该不用在这强调但它到了Embedded的世界可是让很多C++ programmers又爱又恨。
但其实只要更深入C++去了解C++的language 本身的 overhead 及 cost、你就会发现其实C++在embedded上是可行、Symbian C++其实就是一个范例。
Symbian C++ 跟一般的 C++ 有些一开始无法理解的差异、2 stages constructions及no exceptions handling。说不定大家已经猜到 C++ Exception 成本很高、果然也是如此在 g++ 的 compile flags 加了 "-fno-exceptions" 大概可以发现 compile 出来的 binary 比原本少了 10~30%。 这还真的节约了不少、把 exceptions 关闭了 2 stages construction就会看起来很自然因为本来在 constructor 里如果有错误的话那就会 throw 让构造失败来释放 new 出来的 memory、现在无法throw了只好写一个像 bool construct() function, 让 return 来告知 construct 成功或失败、可以看看以下的 template及 code usage sample:
template<class T>
T* construct(T* t) throw()
{
if (t)
{
if(!t->construct())
{
delete t;
t = NULL;
}
}
return t;
}
class Foo
{
public:
Foo()
:mBuffer(NULL)
{
}
~Foo()
{
delete[] mBuffer;
}
bool construct()
{
mBuffer = new char[SOME_SIZE];
return mBuffer != NULL;
}
private:
char* mBuffer;
}
Foo* p = construct(new Foo);
if (p) // does allocated ptr checking as you do in C
{
...
}
Construct 的问题解了但try/catch/throw怎么办?这只能说鱼与熊掌不能兼得、在设计 API 时必须都还是朝 C 的方式有个 int error code return、unwind stack 的成本真的很高而且用 Error codes 其实还是有很多比 Exception 好用的好处。
posted on 2009-04-27 02:20
Nash Tsai 阅读(292)
评论(0) 编辑 收藏 引用