ゆとりーなの日記

日記的な事を書いて行くと思はれる

12ステップ組込みOS自作本もくもく会に参加してきた

お誘いがあったので行ってきました。C++やってました。
自作optionalがバグってそうというところで終わったのですがお家に帰ってから軽くぐぐったところ問題発覚しました。アライメント周りでした。placement newを単純なchar配列でやると残当するという話っぽいです。会場でprintfデバッグしたところコピーが失敗してるというかなんかメンバが指してるアドレスがズレてるっぽいなとは思っていたのでまぁそういうことなのでしょう。矢張りこの辺りは危険がいっぱいなので自分からは手を出さないに越したことはないのですが、本の方がライブラリ自作な雰囲気を醸し出しているのでH8でOS作成ではBoostの使用は自重してしまうわけですね。
取り敢えず安直に対応してみました。これでアライメント揃えてくれそうな予感がします。

union storage {
  storage() {}
  char buffer[sizeof(T)];
  T t;
} area_;

まぁboost::alignment_of、boost::aligned_storageみたいなものを作って対応した方がいい気もしますが取り敢えずこれで動くようになったのでまぁいいかという甘えを見せつつ全然H8とは関係ないところをもくもくやっていたというオチでした。
追記:
それっぽい記事を発見しました。本の虫: C++0xのUnion。何もしないデストラクタを追加すれば大丈夫そうな感じですかね。
さらに追記:
使用側でplacement newしてない生メモリに対してそれをキャストしてコピーしようとしてたミスがあったっぽいことも発覚。二重にひどいことをしていた疑惑という話でした。