動的配列の必要性がわかりません。私がこれまでに理解していることから、実行時に必要な配列のサイズを常に判断できるとは限らないため、動的配列が必要です。
しかし、確かにこれを行うことができますか?:
cin >> SIZE;
int a[SIZE];
では、動的配列とnew
演算子の重要な点は何でしょうか?
動的配列の必要性がわかりません。私がこれまでに理解していることから、実行時に必要な配列のサイズを常に判断できるとは限らないため、動的配列が必要です。
しかし、確かにこれを行うことができますか?:
cin >> SIZE;
int a[SIZE];
では、動的配列とnew
演算子の重要な点は何でしょうか?
まず、これはコンパイラの拡張機能であり、標準 C++ ではありません。次に、その配列はスタックに割り当てられますが、演算子 new はヒープから割り当てられます。これらは、配列の寿命に大きく影響する 2 つの非常に異なる場所です。その配列を返したい場合、そのコードは何に使用されますか? 第三に、サイズを変更したい場合はどうしますか?
cin >> SIZE; int a[SIZE];
一部のユーザーはマウスを使用するのに苦労していますが、アプリケーションに割り当てるメモリの量を彼らに伝えてほしいですか?
SIZE
値を変更できることを意味する変数です。定義上、配列のサイズは拡大も縮小もできません。したがって、サイズはコンパイル時定数である必要があります。
個人的に私が好む:
std::cin >> size;
std::vector a(size);
後で、他の人が述べたように、次のようなことができます...
std::cin >> size;
a.resize(size);
...しかし、これがおそらく重要なポイントです。したくない場合は、その必要はありません。要件と制約が、静的サイズの配列/ベクトル/その他のデータ構造で満たされるようなものである場合は、素晴らしいことです。非常に便利なツールを削除するために、他の人の要件や制約について十分に理解しているとは思わないでください。
動的配列は非常に便利です...オブジェクトを生成し続け、生成されるオブジェクトの数がわからない場合 (つまり、誰かがプロンプトで回答を入力したり、ネットワーク ソケットなどからどれだけの入力を取得するかなど) .)? 必要な適切なサイズを予測するか、ハードリミットをコーディングする必要があります。どちらも苦痛であり、配列のハード制限の場合、発生する可能性のあるすべての状況をカバーしようとするために、目の前のジョブに大量のメモリを割り当てることにつながる可能性があります。それでも、セキュリティ ホールやクラッシュを引き起こすバッファ オーバーランが発生する可能性があります。オブジェクトが新しいメモリを動的に割り当てる機能を持ちながら、オブジェクト間の関連付けを維持して、(あなたのような線形時間のアクセスではなく) 一定時間のアクセスができるようにする
C の初期の頃は、最初に関数に入ったときにスタックにスペースが作成され、スタックのサイズは別の関数を呼び出すか戻るまで変更されませんでした。これが、すべての変数を関数の先頭で宣言する必要があり、コンパイラが既知の量のスタックを予約できるように、コンパイル時に配列サイズを知る必要がある理由です。
C++ では変数宣言の制限が緩和されましたが、コンパイル時にスタック要件を知るという制限は維持されていました。どうしてか分かりません。
コメントのリンクに記載されているように、C は最終的に動的サイズの配列を許可しました。これは、C と C++ が分割された後に発生したため、C++ は自動的にその機能を獲得しませんでした。C++ の拡張機能としてサポートされていることは珍しくありません。