Go でさまざまなサイズのスライスを作成しようとすると、メモリ割り当ての問題が発生しました。これらの制限の背後にある理由をさらに詳しく見てみましょう。
Go のドキュメントによると、スライス要素には 0 から len(s)-1 の範囲のインデックス値があり、スライスの最大容量がターゲット ビルドのネイティブ整数のサイズ。
ソース コードを調査すると、特定のサイズのスライスの作成が安全であることを確認する安全性チェックが発見されました。 feasible:
if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxmem/uintptr(t.elem.size) { panic(errorString("makeslice: len out of range")) }
あなたの場合、条件 uintptr(len) > maxmem/uintptr(t.elem.size) が true になり、要求された割り当てが禁止されます。これは、スライスに必要なメモリが最大メモリ制限を超えるためです。
ただし、メモリを消費しない空の構造体のスライスを割り当てる場合は、同じ割り当てサイズが許容されます。
r := make([]struct{}, math.MaxInt64)
空の構造体はメモリを消費しないため、メモリ要件を評価する条件が false になるためです。 Go では、このような型に対して非常に大容量のスライスを作成できます。
以上がGo スライスの最大サイズを制限するものは何ですか?また、空の構造体が違いを生むのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。