c++における配列の最大長の理解
2850 ワード
多くの人が疑問を持っているかもしれません.配列の最大定義可能な長さはいったいいくらですか.
ネット上では、メモリサイズやスタックサイズなど、さまざまな説があります.
今日はここでまとめてみます.皆さんOKが理解できたと思ったら、「いいね」をクリックしてくださいね~
まず、配列の最大長を決定するには、そのデータ型を知る必要があります.したがって、配列のデータ型は制限要因の1つです.データ型によって要素のサイズが異なるためです.明らかに(
また、サイズ(size)のデータ型、すなわち配列下付きのデータ型も、実は制限要因であると考えられます.C/C++では、配列の下付きのタイプは
その後、sizeも物理メモリのサイズに制限される.この点は言うまでもなく、プログラムの実行時に物理メモリのサイズを超えると、このプログラムはすぐにクラッシュします.
次の詳細を展開します.
配列の割り当てには、静的割り当てと動的割り当ての2つの方法があることはよく知られています.さらに具体的には,配列宣言の位置に基づいて,配列を局所配列とグローバル配列に分けることができる.このように議論すると、複雑になりますが、しばらく配列を4つに分けることができます(筆者自身がこのように区分しているだけで、公式にこのような分類があるかどうか分かりません): 1、静的に割り当てられたローカル配列、
2、動的に割り当てられたローカル配列、
3、静的に割り当てられたグローバル配列、
4、動的に割り当てられたグローバル配列.静的に割り当てられたローカル配列は、スタック上の空間を使用するため、静的に割り当てられたローカル配列の大きさはスタックの大きさに制限される.具体的には、配列が存在する関数スタックフレームのサイズです.もちろん、スタックフレームのサイズはスタックのサイズを超えてはいけません.コンパイラの使用に詳しいか、コンパイラのドキュメントを読んだことがある場合は、スタックフレームのサイズ制限を調整する方法を知っておく必要があります.WINDOWSではスタックの大きさは2 M(1 Mということもありますが、要するにコンパイル時に決定される定数)であり、申請されたスペースがスタックの残りのスペースを超えるとオーバーフローを提示します. 一般的に1つのプロセスのスタック空間は2 Mなので、int型配列を定義すると直接オーバーフローするに違いありません.計算することができます:1つのintは4バイトを占めて、配列を定義するならば、2 M/4=500 K、もちろんプロセスの起動自体は多くのものがスタックに入るので、500 Kより小さいです.500 K=500000 Bなのでint配列の最大範囲は500000(推定)、charタイプの最大範囲は200000と考えられます. PS:ここでのBはバイトを指します.intは4バイト:つまり4*8=32ビットである.したがってintの理論最大値は2^32−1である.しかし正負を考慮するため、実際は-2174748648~21748647[-2^31~2^31-1]です.intの大きさはコンピュータのデータワード長、コンパイラに関連している.配列の大きさはスタック空間、intの大きさによって決まる.したがって,配列の最大長はプロセススタック空間,コンピュータデータワード長,コンパイラによって決定される.具体的には展開しません.
【まとめ:静的配列の大きさが小さい】
動的に割り当てられたローカル配列と動的に割り当てられたグローバル配列は、クラスに分けられる.本質的には、スタックに空間を割り当てるため、スタックのサイズに制限されます.スタックは不連続なメモリ領域であり、スタックのサイズはコンピュータシステムで有効な仮想メモリに制限されているため、スタックのサイズは一般的に大きい.newが出てくると、スタックスペースは32ビットマシンで4 G(2^32=(2^10)^3*4=4 G)となり、4 G/4=1 Gで理論的には1 Gより小さく、つまり10000000より小さく(1 M=1000 KB=10000000 B)、これ以上大きくなるとスタックオーバーフローします.64ビットマシンはアドレス空間が大きいので、多分(2^64、基本的には使いきれない)あるので、64ビットマシンは動的割り当てが永遠に使い切れないと考えられます.
静的割当てのグローバル配列については、静的記憶領域にメモリ領域を割り当てることを知っているため、サイズは自然に静的記憶領域のサイズに制限され、BSS(Block Started by Symbol)とも呼ばれ、アセンブリ言語ではデータセグメントとも呼ばれています.現在、静的ストレージ領域のサイズの制限はまだよく分かりません.私のパソコン(Core i 3-3110 M、メモリ8 GB)で実験をしたことがあります.私が割り当てることができる最大サイズは残りのメモリの約1/2であることがわかりました.ネット上では「あなたの定数はどれだけ大きいか」という言葉がありますが、まだ検証が必要です.【とにかくこれは基本的に大きく設定できる】 Note:スタックフレームに関する概念は、「コンピュータシステムを深く理解する」という本や、コンピュータアーキテクチャに関する他の資料を参照することができます.
まとめ:
静的に割り当てられた局所配列を除いて、他の基本的には上限を考慮する必要はありません(現在一般的な64ビットマシン).
ネット上では、メモリサイズやスタックサイズなど、さまざまな説があります.
今日はここでまとめてみます.皆さんOKが理解できたと思ったら、「いいね」をクリックしてくださいね~
int
が4バイト、char
が1バイトであると仮定する)、データ型char
の配列の最大長はint
の配列の4倍である.std::size_t
であるため、配列の大きさはまずsize_t
で表される大きさを超えてはならない.このデータ型は、ライブラリファイルstdio.h
においてtypedef
によって宣言され、32ビットプログラムについてはunsighed int
、64ビットプログラムについてはunsigned long
と定義される.前者が表す最大サイズは2^32−1,後者は2^64−1である.次の詳細を展開します.
2、動的に割り当てられたローカル配列、
3、静的に割り当てられたグローバル配列、
4、動的に割り当てられたグローバル配列.
【まとめ:静的配列の大きさが小さい】
まとめ:
静的に割り当てられた局所配列を除いて、他の基本的には上限を考慮する必要はありません(現在一般的な64ビットマシン).