2010-11-11-01-文字コードの話 - 12 - project-enigma

2010-11-11-01-文字コードの話 - 12

>> Site top >> weblog >> 月別アーカイブ >> 2010年11月のlog >> 2010-11-11-01-文字コードの話 - 12

最終更新日付:2013/12/31 07:35:52


文字コードの話 - 12

2010 年 11 月 11 日

再び前回の続きだ。Dynamic::Iterator に多態的な振舞いをさせるという工夫について。

そもそもの問題は、Iterator 自体をポリモーフィックなクラスにできないという点にある。なぜなら、Iterator は値で受け渡しすることが想定されているからだ。そのために代入演算子やコピーコンストラクタが定義されている。結果として Dynamic::Iterator だけを抽象クラスにして派生クラスを定義するという方法は取れない。いや、「値で受け渡し」という前提を諦めれば取れないことはないが、それだとダイナミックヒープを使うことになる。ポインタのかわりとして使うオブジェクトをいちいち new/delete するというのはいただけないし、こういうオブジェクトはストレスフリーで使えなければならない。

というわけで、Dynamic::Iterator の内部でどうにかして多態を実現しなければならない。しかし、内部実装用の抽象クラスと派生クラスを用意して new/delete を内部で実行するという方法もダメだ。それでは問題の半分しか解決していない。値で受け渡しできるオブジェクトで、内部でも外部でもダイナミックヒープを使わず、しかしポリモーフィックに振舞う、そんなデザインにする必要があるわけだ。

色々悩んだ末、最終的に Encoding::Dynamic の const 参照を Dynamic::Iterator が保持し、実際の処理は全てそちらに転送することにした。Encoding::Dynamic の const 参照は実際にはその派生クラスのインスタンスを指しているから、この部分で多態が実現できることになる。考えてみれば当たり前だしつまらない結論かもしれないが、Dynamic::Iterator がスタック上に占めるサイズを最小化するという観点からは最後の手段だったのだ。というのも、Encoding::Dynamic の const 参照や文字列ポインタ本体、stateful なエンコーディングのためのダムデータなどを含めると、Dynamic::Iterator のサイズはなんと 16 バイトにもなってしまうのだ。

一応これで基本的なデザインについては決着として、数日前から実装を進めている。大域演算子などの詰めがまだだが、これらについては後追いでこなして行くことにした。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.