組込環境でC++を使う際の幾つかの優れた方法

組込環境というのは、メモリが数MBしかなくて(例えば4MB)
プログラムのブートサイズにも限界がある環境の事です。

「例外を使った方が安全です!!」
という言葉をはねのけて必ず「コンパイラのオプションで」offにする。
try、catch、throwを使わないということではない。
暗黙にコンパイラが例外のコードを生成しようとするのを停止させること。
例外にコードを使われると書くことができるコードが減ってしまいます。
最悪ブートができなくなります。エラーはassertでトラップしましょう。
特にC++の例外安全性を理解し、使いこなせる人は少ないので無闇にonにすべきではないです。
例外安全性を理解し、設計できる力のある人はほぼいません。

「dynamic_castの有用性が!!!」
という言葉をはねのけて必ず「コンパイラのオプションで」offにする。
dynamic_castやtypeidを使わないということではない。
暗黙にコンパイラが実行時型情報を生成して保持しようとするのを停止させること。
これでいくらかのコード領域を減少させることができる。
多くの場合はstatic_castで賄える。

                                                        • -
  • STLが使えそうならSTLを迷わず使う

STLを使うとtemplateでコードが肥大化する!!!!」
という言葉をはねのけて必ずmapファイルを確認して最適化されたSTLのコードの実体化を調べる。
コンパイラによってはSTLに特化した最適化があり、
vectorやlist、dequeなどのコードを「型が違っていても」void*に共用化するものがある。
ただし、Effective STLを読むこと。

                                                        • -
  • newとdeleteの実装を検討し、placement newを理解し、カスタムアロケータも用意する

稼働時間にもよるが、僅かなメモリの断片化が死を招く。
断片化のしづらい実装を選ぼう。dlmallocはそのための良い候補になりうる。
また、placement newで既にあるメモリ空間を使ってコンストラクションを起こすことを検討しよう。
STLにはカスタムアロケータを与えよう。

                                                        • -
  • アセンブリを読んだり、ダンプを眺めたりしよう

アセンブリを読むことで、どういったコードが生成されるのかを感じよう。
また、ダンプを眺めて読むことになれることで、メモリがどうなっているのかを感じることができるようになる。

少なくとも、.rodata, .text, .bss, .dataなどを理解しよう。
セクションを理解し、CPUによっては特別なメモリ空間があることもあるので、
メモリの特性を理解しよう。

                                                        • -
  • 多重継承は使おう

多重継承を避けると、C++の継承機構は途端に貧弱になる。
「コンポジション、コンポジション!!!!!」と叫ぶ人たちを無視して、
「多重継承?」とか疑問符をなげる人を無視して
mix-inのつもりで多重継承を使おう。
仮想継承も理解する。
何でも継承すれば良いというわけではありません。

                                                        • -
  • リファレンスをちゃんと読みましょう

組込環境ならではの「裏技」が載っていることもあります。
どんどん読み込むべき裏技集。
読まねばいけません。うひょー、と叫ぶこともあります。

                                                        • -

他にも色々と気をつけるべきことはありますが、
1tick、1MicroSecondsを争う世界は過酷です。
しかし、ちょっとした工夫で凄く速くなります。


楽しいですよ!!!!!