問題タブ [realloc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 動的スタックタイプを実装する最良の方法は?または私はreallocを悪用していますか?
ネイティブスタックタイプを持たないあいまいな言語を使用しているので、独自の言語を実装しました。今、ネットで読んで、私はこれを行うためのいくつかの異なるアプローチを見つけました。
これは私の実装です(疑似コード)
値をポップした後にrealloc()呼び出しを使用してスタックのサイズを変更すると、パフォーマンスが低下すると言う人もいるので、いくつか質問があります。
- mallocを使用してスタックを拡張し、プログラムの最後に解放するのが最善ですか?
- スタックのサイズを変更(プッシュ)するには、4バイト以上増やすのが最適ですか?
- いっぱいになったときに割り当てられたメモリを2倍にして、スタックを増やすのがベストプラクティスですか?
- 上記のコードについてどう思いますか?
memory-management - gcc/linux によるインプレース再割り当て
そのようなことはありますか?可能な場合は移動せずにメモリを再割り当てするか、不可能な場合は何もしない関数を意味します。Visual C には、私が望むことを行う _expand があります。他のプラットフォーム、特に gcc/linux の同等物について知っている人はいますか? 私は主に、可能な場合はメモリをその場で縮小することに関心があります (また、誰かが尋ねた場合に備えて、標準の realloc はサイズが小さくなってもメモリを移動する可能性があります)。
これを行うための標準的な方法がないことはわかっており、実装に依存する汚いハックのトリックを明示的に求めています。どこかで機能することを知っているものをすべて挙げてください。
c - 再割り当ての実装
次の形式で、単純なリンク リスト ベースのメモリ マネージャーを作成しています。
...Header|Block|Header|Block... 使用済みおよび空きリスト付き。
realloc() 関数がブロックのサイズを縮小するように要求された場合、末尾のバイトの一部を新しく作成されたブロックのヘッダーで上書きしても問題ありませんか? 私が読んだドキュメントは、これが「未定義の動作」であることを示唆していますが、アプリケーションはまだそこにあるデータに依存していますか?
realloc - 失敗した場合、realloc は以前のバッファーを解放しますか?
realloc が失敗して NULL が返された場合、以前のバッファは解放されていますか、それともそのまま保持されていますか? マニュアルページにその特定の情報が見つかりませんでした。どうすればよいかわかりません。メモリが解放されている場合、二重解放は危険です。そうしないと、漏れが発生します。
c - 新しいサイズが小さい場合、ポインタを再割り当てできますか?
C または C++ 標準が、 realloc が小さい (ゼロ以外の) サイズで呼び出されたときにポインターが変更されないことを保証するかどうか疑問に思っています。
基本的に、OS は、大きなメモリ ブロックを解放したので、すべての再割り当てを利用してメモリを最適化し、何らかの方法で ptr2 を移動することを独自に決定できますか?
c - Win32 HeapReAlloc() が値を変更するのはなぜですか?
win32 API を使用して C でアプリを作成しています。HeapRealloc() 関数を使用して配列のサイズを拡大しようとすると、配列内の現在の値がコピーされずに変更されます。メモリを再割り当てするために使用するコード:
ブレークポイントにあるときの配列のステータスを次に示します。フィード配列は、現在の配列の状態を示します。一時配列は、新しい再割り当てされた配列の状態を示します (これは異なります)。
フィード配列:
feedArray http://www.freeimagehosting.net/uploads/526b0b2172.jpg
一時配列:
tempArray http://www.freeimagehosting.net/uploads/17858f2e7e.jpg
助けてください.. :\
MSDNの関数説明へのリンク
c - メモリが原因で失敗したときにreallocを処理するにはどうすればよいですか?
質問はそれをすべて言いますが、ここに例があります:
すべてのデータをNULLにするのではなく、メモリ不足を処理するにはどうすればよいですか?
編集-実行できることがあると仮定しましょう。たとえば、どこかでメモリを解放するか、少なくともユーザーに「それはできません。メモリが不足しています」と伝えます。理想的には、そこに割り当てられたものを残したいと思います。
c - malloc(0) は何を返しますか?
何をmalloc(0)
返しますか?
の答えは同じrealloc(malloc(0),0)
でしょうか?
Linux GCC からの出力:
の出力は毎回変化し続けmalloc(0)
ます。これは標準的な答えですか?そして、学術研究以外で、なぜそのようなポインターを取得することに興味があるのでしょうか?
編集:
ダミー ポインターを返す場合malloc(0)
、次はどのように機能しますか。
編集:
次のコードは、反復ごとに「可能」を出力します。なぜ失敗してはいけないのですか?
c - reallocがメモリブロックを移動するときに他のポインタを更新する方法は?
realloc リファレンスには次のように書かれています。
この関数はメモリ ブロックを新しい場所に移動する場合があり、その場合は新しい場所が返されます。
これを行うと、次のようになります。
realloc がブロックを移動すると、cptr が無効になる可能性がありますか?
はいの場合、realloc は何らかの方法でブロックを移動することを通知するので、cptr が無効になるのを防ぐために何かを行うことができますか?