C ++の静的配列と動的配列の違いは何ですか?
クラスの割り当てを行う必要がありますが、静的配列は使用せず、動的配列のみを使用するように指示されています。私は本とオンラインを調べましたが、理解していないようです。
静的はコンパイル時に作成され、動的は実行時に作成されると思いましたが、これをメモリ割り当てと間違えている可能性があります。
C ++の静的配列と動的配列の違いを説明できますか?
C ++の静的配列と動的配列の違いは何ですか?
クラスの割り当てを行う必要がありますが、静的配列は使用せず、動的配列のみを使用するように指示されています。私は本とオンラインを調べましたが、理解していないようです。
静的はコンパイル時に作成され、動的は実行時に作成されると思いましたが、これをメモリ割り当てと間違えている可能性があります。
C ++の静的配列と動的配列の違いを説明できますか?
ローカル配列はスタック上に作成され、自動保存期間があります。手動でメモリを管理する必要はありませんが、使用している機能が終了すると破棄されます。それらは必然的に固定サイズになります:
int foo[10];
で作成された配列にoperator new[]
は動的な保存期間があり、ヒープ(技術的には「フリーストア」)に保存されます。それらは任意のサイズにすることができますが、スタックフレームの一部ではないため、自分で割り当てて解放する必要があります。
int* foo = new int[10];
delete[] foo;
static は C および C++ のキーワードであるため、一般的な記述用語ではなく、変数または配列に適用される場合、static は非常に具体的な意味を持ちます。混乱をさらに悪化させるために、それは別々の文脈の中で 3 つの異なる意味を持っています。このため、静的配列は固定または動的のいずれかになります。
説明させてください:
1 つ目は C++ 固有のものです。
2 つは C から継承されます。
関数内では、静的変数は、関数呼び出し間でメモリ位置が保持される変数です。一度だけ初期化され、関数呼び出し間でその値を保持するという点で静的です (静的を使用すると、関数は再入不可になります。つまり、スレッドセーフではありません)。
関数の外で宣言された静的変数は、同じモジュール内からのみアクセスできるグローバル変数です (他の #include を含むソース コード ファイル)。
あなたが尋ねるつもりだった質問(私は思う)は、動的配列と固定またはコンパイル時配列の違いは何ですか。それは簡単な質問です。コンパイル時の配列は事前に (プログラムのコンパイル時に) 決定され、関数スタック フレームの一部です。これらは、メイン関数が実行される前に割り当てられます。動的配列は実行時に "new" キーワード (または C の malloc ファミリ) で割り当てられ、そのサイズは事前にわかりません。プログラムの実行が停止するまで、動的割り当ては自動的にクリーンアップされません。
クラスで使用されているセマンティクスは混乱を招くと思います。おそらく「静的」が意味するのは単に「一定サイズ」であり、おそらく「動的」が意味するのは「可変サイズ」です。その場合、一定サイズの配列は次のようになります。
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[]
定義されているため、配列と同じセマンティクスで使用できます。
用語の意味を明確に定義することが重要です。残念ながら、静的配列と動的配列の意味については複数の定義があるようです。
静的変数は、静的メモリ割り当てを使用して定義された変数です。これは、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
operatorを使用して行われます。
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
必要だったのは静的配列でも自動配列でもなく、演算子を使用した動的メモリ割り当てを使用したものか、eg を使用した固定サイズでない配列のいずれかであったことは明らかだと思いますstd::vector
。
静的配列にはコンパイル時にメモリが割り当てられ、メモリはスタックに割り当てられます。一方、動的配列には実行時にメモリが割り当てられ、メモリはヒープから割り当てられます。
int arr[] = { 1, 3, 4 }; // static integer array.
int* arr = new int[3]; // dynamic integer array.
この文脈では、サイズが固定されているという意味で静的であることを意味すると思います。std::vectorを使用します。resize()関数があります。
実行時にサイズがユーザーによって設定されるが、その後は固定される疑似動的配列を持つことができます。
int size;
cin >> size;
int dynamicArray[size];
はい、静的配列はコンパイル時に作成されますが、動的配列は実行時に作成されます。違いはメモリの場所に関するものですが、静的はスタック上に配置され、動的はヒープ上に作成されます。.net フレームワークの場合のようにガベージ コレクターが存在しない限り、ヒープに配置されるすべてのものにメモリ管理が必要です。存在しない場合、メモリ リークのリスクがあります。
静的な配列は、配列の側にある要素を与えることを意味します
動的な配列は、配列の側に要素を与えないことを意味します
例:
char a[10]; //static array
char a[]; //dynamic array