Goスライス の拡張メカニズム
Go言語のスライスとは、容量不足時に自動拡張可能な可変長配列のことです。
- スライス長が1024未満の場合、容量を拡大する度に容量は2倍になります。例えば、初期容量が2の場合、拡大が必要な場合、容量は4、次に8、順次2倍になります。
- スライスの長さが 1024 以上になると、容量の拡張時に新しい容量は増加率に基づいて計算されます。デフォルトの増加率は 1.25 で、つまり容量を拡張するごとに容量は以前の容量の 1.25 倍になります。
- Go言語では、スライス容量が増大するとき、スライスの要素サイズに基づいてメモリが割り当てられます。要素のサイズが1024バイト以下であれば、増大時には既存の容量と新しい容量の、より大きい値が容量として割り当てられます。要素のサイズが1024バイトを超える場合は、既存の容量と新しい容量の、より小さい値が容量として割り当てられます。
スライスの容量を増やすと元のデータは新しいメモリ領域にコピーされるので、増減を繰り返すとパフォーマンスが低下することがあります。増減を抑えるためには、スライスを作成するときに容量をあらかじめ設定しておくと良いでしょう。