[内部実装について] C++の例外をoffにしても大丈夫なように

これまでも一応C++の例外をoffに出来ていたのですが、とても制限が多いものでした。
例えば、protectedの関数を外部から呼んだ場合やC++の関数に渡すべきオブジェクトの型を間違えていた場合、復活できずにexit(1)で強制終了させていました。
それの制限をなるべく無くし、ちゃんとそれらもxtal内のtry .. catch文で捕まえられるような実装に組み立てなおし中です。


今回これをしようと思い立った一番の理由は、バイナリサイズを削減するためです。
Xtalは、スマートポインタを使ってオブジェクトの寿命管理をしていますが、それが原因でバイナリサイズが肥大化していました。


スマートポインタは、コンストラクタで参照カウンタをインクリメントし、デストラクタでデクリメントするため、デストラクタを定義する必要があります。
デストラクタが存在するクラスのインスタンスを扱うプログラムは、デストラクタが正常に呼ばれるようにするため、例外の発生に備えたコードをコンパイラが生成します。
Xtalはスマートポインタをそこら中で使っているため、そのコンパイラが生成した例外に備えるためのコードサイズは、VC2005で作られたバイナリではなんと全体の5分の1以上にまで膨れていました。


これを解決するには、参照カウンタ方式のGCを止めるか、例外をoffに出来るようにするしかありません。
参照カウンタ方式GCは、ポータビリティがあり、GC一回の速度がとても速いため、例外を無しに出来る方がいいだろうと判断しました。


なお、使用方法ですが、例外をoffにした場合はXTAL_NO_EXCEPTIONSマクロを定義する必要があります。
g++のフラグでいうと、 -fno-exceptions -DXTAL_NO_EXCEPTIONS を付けるということです。


ただ、完全に制限を無くすことは出来ないので、バイナリサイズが少々大きくなっても構わない場合、なるべく例外はoffにしない方がお勧めではあります。