posts - 2,comments - 0,trackbacks - 0
在接触过不少在写 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 @ 2009-04-27 02:20 Nash Tsai 阅读(150) | 评论 (0)编辑 收藏
Boost 在 2月8号发怖了 1.38.0,里面新增了3个库,Flyweight、ScopeExit及Swap。里面让过我最感动的库就是Flyweight 〈http://www.boost.org/doc/libs/1_38_0/libs/flyweight/doc/index.html〉。我想看过 GoF 的设计模式里的Flyweight pattern 对 Flyweight 这个模式一定不陌生,也知道它的重点是节约内存。我自己也实现过一个 StringResource class,利用了 std::map (rbtree) 及 boost::shared_ptr<std::string> 来节约字串在内存的消耗。但看了 boost flyweight 给的 performance report 〈http://www.boost.org/doc/libs/1_38_0/libs/flyweight/doc/performance.html〉及不改变原使 string class 的操作行为,我想我可以把我写的 StringResource class替换了。
posted @ 2009-03-31 23:13 Nash Tsai 阅读(575) | 评论 (0)编辑 收藏
仅列出标题