boost::poolがうまいこと動かない件

先週いっさい研究が進んでないという罠。そんなわけで、今日は少々プログラムをいじってた。boost::poolがWinなら動くのにSolarisで動かない件について。卒論のときは、デバッグしてる時間がなかったもんやから、とりあえず放置してデフォルトのnewで妥協してたわけですが。なんとかせねばなぁと。

プログラムは基本的にVisualStudioで書いてWin上で動作確認だけして、高速なUnixマシンで実行ってなかんじでやってるので、こーゆー環境依存のデバッグはつらい。しかもデバッグコンパイルでは動くのに、最適化かけるとセグメンテーションフォルトで落ちるというタチの悪さ。こうなると地道にprint出力以外の方法がない最悪パターン。あぁVisualStudioのデバッガーが神に見えます。

イベントをトレースしながらいろいろ実験してみたところ、原因はどうやらイベント基底クラスのoperator deleteらしいというとこまで判明。
で、状態を確認するためにoperator deleteにprint文を埋め込んでみると...落ちなくなったと言う罠(;´Д`)
この行コメントアウトするとやっぱり落ちる...あのー、画面出力しかいてないんですが。なぜにそれで動くようになったのか。
で、ツッコミたいとこやまやまですが、冷静に考えてみる。print文を追加したことでコンパイラがoperator deleteをinline最適化しなかったのではないか?その可能性はありうる。というわけで、とりあえずinline展開されないのを強制できるように関数宣言と定義を分離してみると...キタコレ(゜∀゜)━━ !!!!!ちゃんと動いた。なぜにdeleteをoutline化すれば動いてinline化だとセグメンテーションフォルトで落ちるのか、関数の中身は変わらないのに。どうみてもコンパイラの最適化バグです。本当にありがとうございました。とりあえず37%速くなりました(当社比)。