参照 (計算機科学)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/12/27 17:39 UTC 版)
住所を使ったたとえ話
参照は家の住所に似ている。住所は非常に小さな識別子であり、それが指しているモノにはさらに豊富な情報があるだろう。例えば、その家を見れば色がわかるが、住所だけでは色はわからない。住所は単に家を見つけることを可能にするだけである。しかし、もし家の色が知りたければ、住所さえあれば見つけ出して実際にその家を見ればよい。つまり、住所は家の色を知るための充分な情報源となる。住所から家を探すことは、参照をデリファレンスすることに似ている。
もっと複雑な例として、引越しの度に新しい家の住所を古い家に残しておくとする。誰かが最初の家を訪ねると、置いてある住所から次の家へ次の家へとたどっていき最終的に現在の家にたどり着くことができる。これは参照を使用した単純な線形リストに似ている。
住所の別の利点は、それが実際の家よりもずっと扱いやすいことである。例えば、町内の人々を姓の五十音順に並べたいとしよう。ひとつの方法として、巨大なクレーンを使って町内の家を全部物理的に並べ替える方法がある。もっと簡単な方法としては、町内の人たちの住所のリストを作り、姓の五十音順にそれを並べ替えるという方法がある。参照にも同様の利点がある。データへの参照を操作することによってデータ自体を変更することなく様々なことができるし、場合によってはその方が効率的である。
日常生活は参照の例であふれている。電話番号、電子メールアドレス、URLなどなど。いずれも遠隔にあるリソースを指し、それらへのアクセスを可能とする。
参照の利点
参照によって、オブジェクトを格納する場所、格納方法、コード内での引き渡しなどの柔軟性が増す。参照によって実際のデータにアクセスできるなら、データ自体を移動させる必要はない。また、複数のコードが参照によってひとつのデータを共有することもできる。
ポインタはオブジェクトのメモリ上のアドレスだけを格納したものである。これは最も基本的で間違えやすい参照だが、最も強力で効率的な参照でもある。スマートポインタは不透明データ構造の一種で、ポインタのように働くが、特定のメソッドを通さないとアクセスできない。
ファイルハンドルはファイルの内容を抽象化する参照である。それはファイルへのロックを要求する際にはファイル自体を指すと同時に、ファイルを読む際にはファイル内の特定の位置を指す。
形式表現
より一般化すると、参照は、あるデータの一意の検索を可能とする別のデータとみなすことができる。これにはデータベースの主キーや連想配列のキーなども含まれる。データの集合 D について、D から D ∪ {null} への一意に定まる関数が参照の定義となる。ここで null は意味のあるものを指していないデータである。
このような関数の別の表現として、「到達可能性グラフ; reachability graph」と呼ばれる有向グラフがある。ここで、各データは頂点として表され、データ u から データv へのエッジがあるとき、u は v を参照している(グラフ理論)。最大出次数は 1 である。このように参照をグラフとして捉えることはガベージコレクションで到達不可能なオブジェクトからのアクセスを分離するのに有効である。
- 参照 (計算機科学)のページへのリンク