- 締切済み
配列を宣言した際メモリ内の様子
「配列」を宣言した際、メモリ内では何が起きているのでしょうか? 配列宣言した際にメモリ内にて、複数のデータを格納する為に、メモリー領域がまとめて確保され、その確保した領域に名前が付けられるのでしょうか? 分かりやすく教えてください。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- unokwave
- ベストアンサー率58% (966/1654)
言語や実装によりますね。 宣言すると領域を確保する処理系もあれば、領域確保だけでなく初期化を行う処理系もあるし、宣言してもメモリ管理領域に記録するだけの処理系もあります。 纏まっているかも言語や実装、稼働状況によります。 領域が連続確保される型もあれば、動的に非連続確保される場合もあります。 CPUの持つ原始的な形態により近い実装であるアセンブラやC言語であれば、領域がまとめて確保される形式が基本ですが、そうではない確保の仕方も可能です。 名前はメモリー番地につけられた別名ですが、言語によっては実際に名前をつけて管理されます。
- bardfish
- ベストアンサー率28% (5029/17766)
言語は何でしょうか? 基本的には配列変数というのは便宜的につけられたもので人間が理解し使いやすいようにされているものです。コンピューター内部ではメモリの配列は直線的に並んでいるだけでn次元配列のような複雑なものではありません。 名前(変数名だと思いますが)についても人間がわかりやすくするために便宜上使えるようにしているだけでコンピューター内部ではアドレス指定で処理されます。 配列変数を宣言した時点ではメモリ内では特に何も起きません。C言語だったらポインター宣言の有無で扱いが変わってきます。 配列変数も配列数を決めて宣言する場合と決めずに宣言することができます。これもプログラミング言語によって宣言の仕方や使い方に違いがあるでしょう。ですが、コンピューターにしてみればコンパイル後のコードに大差ないので言語による差異なんて関係ありません。 配列変数のメモリ領域を事前に確保したいというのであればそういう命令があります。少なくともC言語にはあります。mallocですね。あまり使ったことはありませんが構造体を配列として使用したいときに使うことがないわけではない。イメージとしては構造体はデータベースのレコードレイアウトで、mallocするのはデータベースのテーブル領域の確保って感じですね。 データベースでもそうなんですが、記憶領域上で連続した領域を確保できていれば最高のパフォーマンスを期待できます。 デフラグで確認できるように同一ファイルがディスク上にバラバラに記録されていると読み込み時に時間がかかってしまうというのはご存知ですよね?それと同じことがメモリでも発生すると考えてください。 大容量が当たり前になった現在のパソコンではパフォーマンス的には意味がないかもしれませんが、搭載可能なRAM容量が限定的だった頃のコンピューターでは処理に必要にメモリを確保できるかどうかの事前確認としても使えていました。DOSの頃なんて「640KBの壁」なんて問題もありましたからね(笑)