INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
本業の方のお仕事が再び忙しくなりつつあるので、断続的にしばらく更新が止まることがあります。

目次 | ←前へ / 2010-12-07 00:15 / 次へ→ / 最新へ⇒

■少し調べれば分かりそうだが面倒くさいこと

2010/12/ 7 0:15:21


RSSRSS配信中

https://www.inasoft.org/








少し調べれば分かりそうだけど、面倒くさくて調べていないことがあります。例えば次の2つ。

■ノイマン型でないもの

コンピュータを扱っていると、当たり前のように扱うことになる「ノイマン型のコンピュータ」。たしか、CPUがメモリから命令を読んで実行をする行為を繰り返すんだったと思いますが、「型」と付くわけだから「ノイマン型ではない型」というのもあるのかなぁ、と。

まぁ「非ノイマン型コンピュータ」で調べればわかるとは思うけど、面倒くさいからあとで。


■vector<T>::erase

C++のSTLでイテレータを扱っているときは、それがいつ無効になるかを考慮しなければなりません。ポインタによるメモリ動的確保を使ったら解放を意識しなければならないこと注意が必要ですね。というのも、イテレータが無効になる瞬間って、(規則的ではあるけど)直感的でないことがあるから。

例えば、vector<T>::insertは、メモリの追加を行うけど、vectorは連続したメモリ上にないといけないので、「連続した空きメモリがなければ、それまでのメモリは破棄されて、もっと大きな空きメモリのある場所に再確保」される。

vectorのイテレータはポインタとして実装される(ことが多い?)から旧メモリが破棄されたときにイテレータはすべて使い物にならなくなるというわけ。だから、vector<T>::insertの前に作ったイテレータはアテにしてはならない。

さて、問題なのは、vector<T>::erase。eraseの常識として、eraseの対象とした要素(や場合によっては後続の要素)を指していたイテレータはアテにならなくなるから破棄するというのがスジというもの。

しかし、vectorのイテレータはポインタとして実装され、vectorは連続したメモリに配置されるならば、vector<T>::eraseで1つの要素を削除する程度の操作であれば、eraseの対象としていた要素を示しているイテレータは、後続の要素を示すためのイテレータとして引き続き使い続けることは保証できるだろうか?

とりあえず、手元のテストプログラムでは、その考えで合っているっぽいけど、それが実装上の理由や偶然の産物だったら怖い。だから、eraseの戻り値を再びイテレータに代入するわけだけど…。

さて、どうなんだろうなぁ。

追記:後からよく考えたら、vectorはメモリ連続は保証しているけれど、イテレータがポインタとして実装されているかどうかは保証されないわけで





目次 | ←前へ / 2010-12-07 00:15 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。




2559142 (+0150)[+0619]

Copyright© 2010-2021 INASOFT