えーと、C++のstd::dequeは複数個の固定長配列で、リングバッファでdequeを実装する方法もあるけど別ですよ、ってことでいいのですかね
2010-07-19 13:29:35@kikairoya std::vector<std::array<T, PageSize> *> をリングバッファ化してしまえば良いじゃない.ぷぇ~.
2010-07-19 14:12:41@Cryolite vectorの代わりにリングバッファを使うってこと?それは元の論旨から大きく外れてるような [宮崎産を食べよう]
2010-07-19 14:14:17@kikairoya 「元の論旨」というのがどれを指しているかがイマイチ明確ではないのですが,少なくとも http://bit.ly/cdcvqO の「実装」のところに書いてある「動的配列による実装」の2つの bullet にある選択肢は両方とも C++ でも取れますよね?
2010-07-19 14:28:35@kikairoya kikairoya さんが主張されている実装は,前者の選択肢に要素の参照・ポインタ安定性を維持するべく memory indirection を導入しているわけなんですが,そうすると後者に memory indirection を導入したものもアリですよね?
2010-07-19 14:30:34@Cryolite 元々の話が、std::dequeはリングバッファだよ( http://ufcpp.net/study/stl/deque.html )、いやそれじゃstd::dequeにならないよ、ということで、 [宮崎産を食べよう]
2010-07-19 14:33:12@Cryolite 先頭・末尾挿入時の参照の有効性の問題でいくつかのメモリブロックに小分けになってないと要件を満たせないよね、というのが論旨 [宮崎産を食べよう]
2010-07-19 14:34:35@kikairoya あ,それは理解しています.そこで主張されている「std::deque はリングバッファだよ」というのに対して私は「リングバッファ以外の実装も取れる」と異議を申し立てます.ただ,「リングバッファでは実装できない」という主張には違和感を覚えます.
2010-07-19 14:36:26@Cryolite えーと、リングバッファ一つで実装が可能なんですか?リングバッファをいくつか使う、ということなら一応 https://twitter.com/kikairoya/status/18887910453 想定はしてあります [宮崎産を食べよう]
2010-07-19 14:39:10@kikairoya push_[front|back] に対して要素の参照・ポインタが安定であることの根源は,配列に値を直接乗せず,配列と寿命の異なる別の領域に値を確保して間接参照しているところですよね.この視点で見れば,リングバッファも同様なことが可能なのでは?
2010-07-19 14:44:33@Cryolite それはリングバッファ自体にはT *を格納しておくという理解でいいですか? [宮崎産を食べよう]
2010-07-19 14:47:15@kikairoya 少なくとも, http://bit.ly/cdcvqO の「リングバッファに両端キューの内容を格納し、バッファが満杯になったときだけサイズを拡大する」という記述内容に memory indirection を導入した実装は規格上の困難があるように思えません.
2010-07-19 14:48:37http://twitter.com/kinaba/status/18894201292 http://twitter.com/kikairoya/status/18894178807 はい,そーです.実際この実装もありますし,こうすることで有益になる文脈もありますし.
2010-07-19 14:51:04@Cryolite ただ、 http://ufcpp.net/study/stl/deque.html に関しては、要素をリングバッファに直接載せているのでstd::dequeの解説としては不適切と思いますがどうでしょう [宮崎産を食べよう]
2010-07-19 14:56:04ん、というかあれかそれってvector<array<T, PageSize> *>のvectorをringbufferにして、PageSizeを1にしただけじゃん [宮崎産を食べよう]
2010-07-19 15:00:08「ring_buffer<T> だと要素のポインタ・参照安定性が満たせない => ringu_buffer<T *> で間接参照を導入 => allocation の効率化のために chunk 化」という考え方を暗黙に仮定しているからダメダメな説明になっているのかorz
2010-07-19 15:05:19@Cryolite あ、そもそもの発祥がそっちなんですか…vectorの伸長の最大時間を削るためにchunk化したのかとばかり^q^ [宮崎産を食べよう]
2010-07-19 15:08:52@Cryolite C++のstd::dequeをring_buffer<T *>で実装している実例はどこかで見られますか? [宮崎産を食べよう]
2010-07-19 15:11:06