C++ for embedded practice [no-exceptions, 2 stages construction]

C++ for embedded practice [no-exceptions, 2 stages construction]
在接触过不少在写 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 好用的好处。

你可能感兴趣的:(C++ for embedded practice [no-exceptions, 2 stages construction])