2

一部のデータにメモリを割り当てる利点は何ですか。代わりに、それらの配列を使用できます。

お気に入り

 int *lis;
 lis = (int*) malloc ( sizeof( int ) * n );

 /* Initialize LIS values for all indexes */
 for ( i = 0; i < n; i++ )
 lis[i] = 1;

通常の配列を使用することもできました。

malloc がどのように機能するのか、実際には何をしているのか正確にはわかりません。したがって、それらを説明することは私にとってより有益です。

上記のコードを に置き換えsizeof(int) * nn、整数値を格納しようとすると、どのような問題が発生する可能性がありますか? また、変数に格納されている値を、メモリに割り当てられたスペースから直接出力する方法はありますか?たとえば、ここにありlisますか?

4

6 に答える 6

3

より基本的には、スタックとヒープ、変数と定数の問題は別として (そして、そもそも C++ で使用してはならないという事実は別としてmalloc())、関数が終了するとローカル配列が存在しなくなることだと思います。ポインターを返すと、呼び出し元がポインターを受け取るとすぐにそのポインターは役に立たなくなりますが、malloc()またはで動的に割り当てられたメモリnewは引き続き有効です。strdup()たとえば、ローカル配列を使用するような関数を実装したり、リンクされた表現リストまたはツリーを賢明に実装したりすることはできませんでした。

于 2013-09-09T16:32:17.807 に答える
0

一部の古いプログラミング環境では、同等の機能が提供されなかったmallocか、まったく機能しませんでした。動的メモリ割り当てが必要な場合は、巨大な静的配列の上に自分でコーディングする必要がありました。これにはいくつかの欠点がありました。

  • 静的配列サイズは、プログラムが再コンパイルせずに一度に処理できるデータ量に厳しい上限を設定します。TeX で複雑なことをしようとして、「容量を超えました。申し訳ありません」というメッセージが表示されたことがあれば、これが理由です。
  • オペレーティング システム (以前のように) は、静的配列がすべて使用されるかどうかにかかわらず、一度にすべての領域を予約する必要がありました。この現象は「オーバーコミット」につながり、OSは必要なメモリをすべて割り当てたふりをしますが、実際に利用可能なメモリを超えて使用しようとすると、プロセスが強制終了されます。なぜ誰もがそれを望むのでしょうか? それでも、90 年代半ばの商用 Unixの機能として大々的に宣伝されました。これは、小さくて小さな Sun ワークステーションよりもはるかに多くのメモリを必要とする可能性がある巨大な FORTRAN シミュレーションを、小さなインスタンス サイズで問題なくテストできることを意味していたからです。(おそらく、対処するのに十分なメモリが実際にある Cray で大きなインスタンスを実行するでしょう。)
  • 動的メモリ アロケータを適切に実装するのは困難ですジェマロック紙を見て、どれだけ毛むくじゃらかを味わってください。(自動ガベージ コレクションが必要な場合は、さらに複雑になります。) これは、すべての人の利益のために、グルに1 回だけコーディングしてもらいたいものです。

そのため、今日では、非常に必要最小限の組み込み環境でさえ、ある種の動的アロケーターを提供します。

ただし、なしでやろうとすることは良い精神的規律です。動的メモリの過剰使用は非効率性につながります。これは、アーキテクチャに組み込まれているため、後から除去するのが非常に困難な場合が多いです。目の前のタスクが動的割り当てを必要としないように思われる場合は、おそらく必要ありません。

ただし、実際に必要なときに動的メモリ割り当てを使用しないと、文字列の長さに厳しい上限を課したり、再入不可を API に組み込んだりするなど、独自の問題が発生する可能性があります ( と比較gethostbynameしてくださいgetaddrinfo)。

そのため、慎重に検討する必要があります。

于 2013-09-09T16:35:15.397 に答える