﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-nashtsai</title><link>http://www.cppblog.com/nashtsai/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Apr 2026 03:56:27 GMT</lastBuildDate><pubDate>Wed, 08 Apr 2026 03:56:27 GMT</pubDate><ttl>60</ttl><item><title>C++ for embedded practice [no-exceptions, 2 stages construction]</title><link>http://www.cppblog.com/nashtsai/archive/2009/04/27/80977.html</link><dc:creator>Nash Tsai</dc:creator><author>Nash Tsai</author><pubDate>Sun, 26 Apr 2009 18:20:00 GMT</pubDate><guid>http://www.cppblog.com/nashtsai/archive/2009/04/27/80977.html</guid><wfw:comment>http://www.cppblog.com/nashtsai/comments/80977.html</wfw:comment><comments>http://www.cppblog.com/nashtsai/archive/2009/04/27/80977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/nashtsai/comments/commentRss/80977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/nashtsai/services/trackbacks/80977.html</trackback:ping><description><![CDATA[<span style="font-family: Verdana; font-size: 13px; white-space: pre-wrap;">在接触过不少在写 Embedded Linux Firmware 的工程师、他们的开发只用 C Language、也只建议用 C 来开发。 此举并非错误而且出发点是C比C++节省资源、当然还有另一个前题是写的很好的C、所以如果让资浅的工程师来开发那结果会是如何、我想大家可想而知? <br><br>在 C++ 光有Constructor跟 Destructor 就可以避开很多程式的烦琐的 initialize 及 memory leak 的问题、再加上用上了Smart Pointer要memory leak除了误用大概就很难发生了。 C++的好处我应该不用在这强调但它到了Embedded的世界可是让很多C++ programmers又爱又恨。&nbsp;
<br>但其实只要更深入C++去了解C++的language 本身的 overhead 及 cost、你就会发现其实C++在embedded上是可行、Symbian C++其实就是一个范例。&nbsp;
<br>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了只好写一个像&nbsp; bool construct() function, 让 return 来告知 construct 成功或失败、可以看看以下的 template及 code usage sample：</span><br><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;construct(T</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;t)&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">t</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">construct())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;t;<br>&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp; class Foo<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp; public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Foo()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :mBuffer(NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~Foo()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete[] mBuffer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool construct()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mBuffer = new char[SOME_SIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mBuffer != NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char* mBuffer;<br>&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; Foo* p = construct(new Foo);<br>&nbsp;&nbsp; if (p) // does allocated ptr checking as you do in C<br>&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp; } <br></span></div>
&nbsp;
<br>Construct 的问题解了但try/catch/throw怎么办？这只能说鱼与熊掌不能兼得、在设计 API 时必须都还是朝 C 的方式有个 int error code return、unwind stack 的成本真的很高而且用 Error codes 其实还是有很多比 Exception 好用的好处。<br><class t=""></class> <img src ="http://www.cppblog.com/nashtsai/aggbug/80977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nashtsai/" target="_blank">Nash Tsai</a> 2009-04-27 02:20 <a href="http://www.cppblog.com/nashtsai/archive/2009/04/27/80977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost Flyweight</title><link>http://www.cppblog.com/nashtsai/archive/2009/03/31/78515.html</link><dc:creator>Nash Tsai</dc:creator><author>Nash Tsai</author><pubDate>Tue, 31 Mar 2009 15:13:00 GMT</pubDate><guid>http://www.cppblog.com/nashtsai/archive/2009/03/31/78515.html</guid><wfw:comment>http://www.cppblog.com/nashtsai/comments/78515.html</wfw:comment><comments>http://www.cppblog.com/nashtsai/archive/2009/03/31/78515.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/nashtsai/comments/commentRss/78515.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/nashtsai/services/trackbacks/78515.html</trackback:ping><description><![CDATA[Boost&nbsp;在&nbsp;2月8号发怖了&nbsp;1.38.0，里面新增了3个库，Flyweight、ScopeExit及Swap。里面让过我最感动的库就是Flyweight 〈http://www.boost.org/doc/libs/1_38_0/libs/flyweight/doc/index.html〉。我想看过&nbsp;GoF&nbsp;的设计模式里的Flyweight&nbsp;pattern&nbsp;对&nbsp;Flyweight&nbsp;这个模式一定不陌生，也知道它的重点是节约内存。我自己也实现过一个&nbsp;StringResource&nbsp;class，利用了&nbsp;std::map&nbsp;(rbtree)&nbsp;及&nbsp;boost::shared_ptr&lt;std::string&gt;&nbsp;来节约字串在内存的消耗。但看了&nbsp;boost&nbsp;flyweight&nbsp;给的&nbsp;performance&nbsp;report&nbsp;〈http://www.boost.org/doc/libs/1_38_0/libs/flyweight/doc/performance.html〉及不改变原使&nbsp;string&nbsp;class&nbsp;的操作行为，我想我可以把我写的&nbsp;StringResource&nbsp;class替换了。<img src ="http://www.cppblog.com/nashtsai/aggbug/78515.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/nashtsai/" target="_blank">Nash Tsai</a> 2009-03-31 23:13 <a href="http://www.cppblog.com/nashtsai/archive/2009/03/31/78515.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>