C ++の静的配列と動的配列の違いは何ですか?
クラスの割り当てを行う必要がありますが、静的配列は使用せず、動的配列のみを使用するように指示されています。私は本とオンラインを調べましたが、理解していないようです。
静的はコンパイル時に作成され、動的は実行時に作成されると思いましたが、これをメモリ割り当てと間違えている可能性があります。
C ++の静的配列と動的配列の違いを説明できますか?
C ++の静的配列と動的配列の違いは何ですか?
クラスの割り当てを行う必要がありますが、静的配列は使用せず、動的配列のみを使用するように指示されています。私は本とオンラインを調べましたが、理解していないようです。
静的はコンパイル時に作成され、動的は実行時に作成されると思いましたが、これをメモリ割り当てと間違えている可能性があります。
C ++の静的配列と動的配列の違いを説明できますか?
回答:
ローカル配列はスタック上に作成され、自動保存期間があります。メモリを手動で管理する必要はありませんが、使用している機能が終了すると破棄されます。それらは必然的に固定サイズになります:
int foo[10];
で作成された配列にoperator new[]
は動的な保存期間があり、ヒープ(技術的には「フリーストア」)に保存されます。それらは任意のサイズにすることができますが、スタックフレームの一部ではないため、自分で割り当てて解放する必要があります。
int* foo = new int[10];
delete[] foo;
int* foo = new int[N]
います。動的配列のように、delete
自分で作成する必要があるため、例外がある場合は注意が必要です。静的配列にはこれらの問題はありません。
staticはCおよびC ++のキーワードであるため、一般的な説明用語ではなく、staticは変数または配列に適用されると非常に具体的な意味を持ちます。混乱を悪化させるために、それは別々の文脈の中で3つの異なる意味を持っています。このため、静的配列は固定または動的のいずれかになります。
説明させてください:
1つ目はC ++固有です。
2つはCから継承されます:
関数内では、静的変数は、関数呼び出し間でメモリ位置が保持される変数です。これは、一度だけ初期化され、関数呼び出し間でその値を保持するという点で静的です(静的を使用すると、関数は再入可能ではなくなり、スレッドセーフではなくなります)
関数の外部で宣言された静的変数は、同じモジュール内からのみアクセスできるグローバル変数です(他の#includeを含むソースコードファイル)
あなたが尋ねるつもりだった質問(私は思う)は、動的配列と固定またはコンパイル時の配列の違いは何ですか?これは簡単な質問です。コンパイル時の配列は(プログラムがコンパイルされるときに)事前に決定され、関数スタックフレームの一部です。これらは、メイン関数が実行される前に割り当てられます。動的配列は、実行時に「new」キーワード(またはCのmallocファミリー)で割り当てられ、そのサイズは事前にわかりません。プログラムの実行が停止するまで、動的割り当ては自動的にクリーンアップされません。
new[]
演算子を使用して配列のサイズを宣言する場合、実行時までサイズがわからないのはどうしてですか?すなわちint* p = new int[10]
クラスで使用されているセマンティクスは混乱していると思います。おそらく「静的」が意味するのは単に「一定サイズ」であり、おそらく「動的」が意味するのは「可変サイズ」です。その場合、定数サイズの配列は次のようになります。
int x[10];
「動的」なものは、実行時に基盤となるストレージを増減できるようにするあらゆる種類の構造です。ほとんどの場合、std::vector
C ++標準ライブラリのクラスで十分です。次のように使用します。
std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.
std::vector
がoperator[]
定義されているため、配列と同じセマンティクスで使用できます。
new int[10]
用語の意味を明確に定義することが重要です。残念ながら、静的配列と動的配列の意味には複数の定義があるようです。
静的変数は、静的メモリ割り当てを使用して定義された変数です。これは、C / C ++に依存しない一般的な概念です。C / C ++では、次のようにグローバル、ファイル、またはローカルスコープで静的変数を作成できます。
int x[10]; //static array with global scope
static int y[10]; //static array with file scope
foo() {
static int z[10]; //static array with local scope
自動変数は通常、スタックベースのメモリ割り当てを使用して実装されます。自動配列は、次のようにC / C ++で作成できます。
foo() {
int w[10]; //automatic array
これらの配列、、、x, y, z
およびw
に共通しているのは、それぞれのサイズが固定されており、コンパイル時に定義されることです。
自動配列と静的配列の違いを理解することが重要である理由の1つは、静的ストレージは通常、オブジェクトファイルのデータセクション(またはBSSセクション)に実装され、コンパイラは絶対アドレスを使用して配列にアクセスできるためです。これは、スタックベースのストレージでは不可能です。
動的配列が通常意味するのは、サイズ変更可能な配列ではなく、実行時に決定される固定サイズの動的メモリ割り当てを使用して実装される配列です。C ++では、これはnew
演算子を使用して行われます。
foo() {
int *d = new int[n]; //dynamically allocated array with size n
ただし、以下を使用して、実行時に定義された修正サイズで自動配列を作成することは可能alloca
です。
foo() {
int *s = (int*)alloca(n*sizeof(int))
真の動的配列の場合std::vector
、C ++(またはCの可変長配列)のようなものを使用する必要があります。
OPの質問での割り当ての意味は何ですか?求められていたのは静的または自動配列ではなく、new
演算子を使用した動的メモリ割り当て、またはたとえばを使用した固定サイズではない配列のいずれかであったことは明らかだと思いますstd::vector
。
サイズが実行時にユーザーによって設定される疑似動的配列を作成できますが、その後は修正されます。
int size;
cin >> size;
int dynamicArray[size];
静的配列:
動的配列:
はい、そうです。静的配列はコンパイル時に作成されますが、動的配列は実行時に作成されます。違いはメモリの場所に関するものですが、静的はスタックに配置され、動的はヒープに作成されます。.net Frameworkの場合のようにガベージコレクターが存在しない限り、ヒープ上に配置されるものはすべてメモリ管理が必要です。存在しない場合、メモリリークのリスクがあります。
静的配列:効率。動的な割り当てや割り当て解除は必要ありません。
静的修飾子を含む関数でC、C ++で宣言された配列は静的です。例:static int foo [5];
静的なarraryは、配列の横にある要素を与えることを意味します
動的なarraryは、配列の横にある要素を与えることなく意味します
例:
char a[10]; //static array
char a[]; //dynamic array