メモリ領域
Go言語でどのメモリが使用されるのか残しておきたかったので、その記録です。
[低アドレス]
+------------------+ 0x00000000
| ブートローダー | BIOS/UEFIによって最初に実行されるコード
+------------------+ 例: 0x00080000
| カーネル | オペレーティングシステムの中心部分
+------------------+ 例: 0x00100000
| スタティック初期化領域 |
+------------------+ 例: 0x00200000
| *テキスト領域 | プログラムのコード(命令)
+------------------+ 例: 0x00400000
| *データ領域 | グローバル変数、静的変数
+------------------+ 例: 0x10000000
| バッファ領域 | I/O操作のための一時データ保存
+------------------+ 例: 0x20000000
| *ヒープ領域 | 動的に確保されるメモリ
| | 動的メモリ割り当てが行われる
| |
+------------------+ 例: 0x7FFFFFFF
| |
| *スタック領域 | ローカル変数、関数引数、戻り値
+------------------+ 0xFFFFFFFF
[高アドレス]
低アドレスには、コンピュータを動かす上で重要な、変動しづらい値やコードが格納される傾向があるようです。
Go言語において、主に関係するメモリ領域はテキスト領域、データ領域、ヒープ領域、スタック領域の4つです。それぞれの領域がどのように使用されるか、簡単なコード例を使って説明します。
1. テキスト領域 (Program/Code)
プログラムの機械語の命令が格納される領域です。Goでは特に明示的に触れることは少ないですが、バイナリに変換されたコードがこの領域に格納されます。
2. 静的領域 (Static/Data)
グローバル変数や静的変数が格納される領域です。Goではパッケージレベルの変数がこの領域に格納されます。
package main
import "fmt"
// グローバル変数
var globalVar int = 10
func main() {
fmt.Println(globalVar)
}
この例では、globalVar
は静的領域に格納されます。
3. ヒープ領域
動的に確保されるメモリ領域で、Goではポインタやスライス、マップなどがこの領域に格納されることが多いです。ヒープ領域は、new や make で動的にメモリを確保します。
package main
import "fmt"
func main() {
// ヒープ領域に確保される
p := new(int)
*p = 20
fmt.Println(*p)
// ヒープ領域に確保される
s := make([]int, 5)
s[0] = 1
fmt.Println(s)
}
この例では、p
とs
はヒープ領域にメモリが確保されます。
目的 | 動的に確保されるメモリ(ランタイム中にサイズが変わるデータ)を保存する。 |
管理方法 | 手動で確保と解放(Goではガベージコレクタが自動で解放)。 |
特徴 | スタックよりも大きなメモリを扱うことができるが、管理が複雑でアクセス速度が遅くなることがある。 |
4. スタック領域
関数内のローカル変数や関数の引数、戻り値などが格納される領域です。Goではローカル変数がこの領域に格納されます。
package main
import "fmt"
func main() {
// スタック領域に確保される
localVar := 30
fmt.Println(localVar)
}
この例では、localVar
はスタック領域に格納されます。
目的 | 関数呼び出しに関連するデータ(ローカル変数、関数引数、戻り値など)を保存する。 |
管理方法 | LIFO(Last In, First Out)方式で管理され、自動的に確保および解放される。 |
特徴 | 高速ですが、サイズが限られているため、大きなデータ構造や長期間保持するデータには適していない。 |
まとめ
テキスト領域: プログラムの機械語の命令が格納される。
静的領域: グローバル変数や静的変数が格納される。
ヒープ領域: 動的に確保されるメモリ(ポインタ、スライス、マップなど)。
スタック領域: 関数内のローカル変数や引数、戻り値が格納される。
項目 | スタック領域 | ヒープ領域 |
---|---|---|
管理方法 | 自動 | 手動(GC) |
サイズ | 制限あり | 大きい |
速度 | 高速 | 遅い |
メモリ解放 | 自動 | 手動(GC) |
使用例 | ローカル変数 | 動的メモリ |
このように、Go言語でもメモリは4つの領域に分かれており、それぞれの領域でどのように変数が格納されるかが決まっています。