Boost.Optional Must Go (2)

参考: C++でデストラクタを呼ばなくていい条件 - 野良C++erの雑記帳


http://ideone.com/PuFtN

std::cout << boost::has_trivial_destructor< int >::value << std::endl; // true
std::cout << boost::has_trivial_destructor< boost::optional<int> >::value << std::endl; // false
std::cout << boost::has_trivial_destructor< boost::optional<int&> >::value << std::endl; // false


boost::optional は、T の型によらず、デストラクタが trivial ではないようです。
普通に考えて、 T のデストラクタが trivial なら、デストラクタ呼ばなくていいじゃん。
T が初期化されてる場合でもされてない場合でも、結局何もしないんだから。


細かいことですが、これって結構パフォーマンスに効いてきます。
普通はコンパイラが最適化してくれますが、冒頭で挙げたように、
ライブラリ作者が「コンパイラの知らない情報」を元に、手で最適化する場合、
本来 trivial であるべきデストラクタが trivial でないのは痛いです。
部分特殊化すればいい問題でもありますが、限度というものもありますし。




なお、デストラクタが無意味に non-trivial なのは、 boost::noncopyable も同じです。
http://ideone.com/r5CIK
コンストラクタとデストラクタを protected にする為とはいえ…ぐぬぬ




追記:
optional って T* よりサイズ大きいのか…。
http://ideone.com/PIEfo
optional って、表現する物が(良い意味で)限定されているという以外は
T* 以外の何物でも無いハズだし、当然コストも同じだと思ってたのに。


Boost.Optionalに対して、初めて 割と本気で「爆発しろ」と思ったかもしれない。
コンパイラの最適化を考えても、これは少し残念すぎるでしょう。