KDOC 316: Goのスライスは長さを保持している
この文書のステータス
- 作成
- 2024-11-29 貴島
- レビュー
- 2024-11-30 貴島
概要
Go言語のスライスでは、容量と実長を管理している。多めに容量を確保しておいて、満杯になったら新しいスライスの領域を確保してコピーする。これによって実際の配列は固定長で伸ばしたりはできないのだが、プログラマからは動的な配列のように扱える。
配列長(配列ポインタからの距離)を保持しているので、null終端などのマーカーは必要ない。
長さを保持するのでその分のメモリを使い、配列を載せ替える仕組みやオーバヘッドもあるが、昨今のメモリやCPU事情だと問題にならないケースが多い。
https://github.com/kd-collective/go/blob/493edb29735fd2adf2087b32c60617dad11dc6e1/src/runtime/slice.go#L15-L19
type slice struct {
array unsafe.Pointer
len int
cap int
}
関連
抽象。
- 余分な容量を先に確保し、満杯になったら作り直すことで、固定の領域を伸び縮みするように見せる
- 長さを持つと少し余計に使うが、終わりの印が要らない
関連。
- 具体例: KDOC 189: Goでスライスがどのように保存されているか調べる。長さと容量を持ち、容量を超えると別の場所に作り直される様子
- 具体例: KDOC 300: スライスのcapacityが伸長する様子をデバッガで見る。満杯になったときだけ作り直す処理が走る様子
- 比較: KDOC 310: なぜCの文字列はnull終端なのか?。Cの配列と方式を比較する
- 対比: KDOC 314: Cの配列はメモリ効率のため長さを保持していない。長さを持つか持たないかで、得るものと払うものが逆になる