問題タブ [heapalloc]
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.
c++ - Windows C コードでのメモリ割り当て
Windows C プログラミングでどの方法が推奨されているか知りたいです: malloc または Win32 HeapAlloc (おそらく VirtualAlloc?) 関数を使用します。
MSDN のメモリ管理関数の記事と、malloc と HeapAlloc に関する MSDN の記事を読みましたが、どちらをどのような状況で使用すべきかについては言及されていません。
heap-memory - HeapAlloc が 0xC0000017 を返す: 十分なクォータがありません
合計サイズ 2 MB の少数のデータ型を割り当てています。
私は 1 つのヒープのみを使用し、特定の数の割り当てに達するまで問題なく動作します。次の割り当てでクラッシュするように 1 つの割り当てをコメントしたので、これはかなり確信しています。
クォータ = ディスク容量? ドキュメントには、この特定の関数のエラー コードは含まれていません。アプリケーションのプロファイルを作成しましたが、プロセスに割り当てられた空きメモリが十分にあります。また、ヒープポインターにデータブレークポイントを設定しましたが、壊れません。HeapAlloc への呼び出しまで、ステップスルーすると、ヒープポインターは問題ありません。
とても奇妙..
c++ - HeapAlloc が使用するアラインメント
Win32 のHeapAllocを使用する汎用ライブラリを開発しています。
MSDN は、Win32 の HeapAlloc のアラインメントの保証について言及していませんが、過剰なパディングを避けるために、それが使用するアラインメントを知る必要があります。
私のマシン (vista、x86) では、すべての割り当てが 8 バイトに配置されています。これは他のプラットフォームにも当てはまりますか?
c - (C) ヒープ アロケータの実装戦術?
ヒープ アロケーターを実装するさまざまな方法の長所と短所を調べるための優れたリソースはどこにありますか? 効率性 (断片化、スループットなど) に関係するリソースが優先されます。単純なコード リポジトリを探しているわけではありません。
編集:
私は、このウィキの哲学的根拠にはあまり興味がありません。そういうわけで、私がこれに興味を持っている「理由」には入りたくありません。根底にある意図/問題/その他に関係なく、この情報は存在するので、良いリソースを知っている場合は、ここにリンクしてください!
c - (C) how does a heap allocator handle a 4-byte block header, while only returning addresses that are multiples of 8?
It doesn't seem to make sense, unless we just ignore any potential excess space at the beginning of a segment, and then have the first allocated chunk be at the first multiple of 8 (with its corresponding first header being that address -4). This would leave however many bytes before that unused. Is that what's generally done?
edit: thanks to paxdiablo for the detailed explanation below. that all makes sense for 16 byte headers. however, i'm working with a 4 byte header, that looks something like this:
#xA;now, if my heap starts on an address that is a multiple of 8, and any address returned by malloc needs to be a multiple of 8, and i need to use 4 byte headers, I seem to be forced to 'waste' the first 4 bytes of my heap. for example:
#xA;If the heap starts at the carrot above at address 8, using the addressing scheme in this example, the first returnable address i could return to a user following a malloc call would be 16; i need 4 bytes of header, and the first address that's a multiple of 8 which allows 4 bytes of header is 16 (header starts at 12). This means I've wasted the first 4 bytes of my internal heap memory to line things up (8-11).
Is this an acceptable sacrifice, or am I thinking about this wrong?
c - (C) 最も頻繁に使用されるヒープ ポリシーは?
'better-fit' はかなり一般的に使われていると聞いたことがありますが、オンラインであまり読んでいないようです。ヒープ アロケーターが使用する最も一般的に使用される/最も効率的なポリシーと考えられるものは何ですか。
(私の語彙に欠陥があるかもしれないことは認めます。「ポリシー」と言うときは、「最適」、「最初に適合」、「次の適合」などを意味します)
編集:「より適切な」ヒープポリシーとダグラスの戦略(http://gee.cs.oswego.edu/dl/html/malloc.html)の比較にも特に興味があります。Doug は一種のベスト フィットを使用しますが、彼のアプローチはインデックス ビンを使用しますが、ベター フィットはデカルト ツリーを使用します。
c++ - PIMPL とスタック割り当て
そこで、PIMPL とスタック割り当てについて考えてみました。私はライブラリを作成しており、PIMPL を使用してクラスのプライベート メンバーを非表示にすることにしました。つまり、このようにクラスを宣言することになります
それはかなり簡単です。しかし、コンストラクターでこれを行います
したがって、誰かが私のライブラリを使用してスタックに Foo を作成する場合、基本的にヒープ割り当てを行っています。これは、PIMPL を使用する際に考慮しなければならないトレードオフですか? コンストラクターの横に警告を表示してドキュメントをリリースすることを考えました:「警告: これにより、ヒープ割り当てが発生します」など。
私のもう 1 つの考えは、純粋な仮想インターフェイスとして実装に公開されるすべてのクラスと、スマート ポインターを返す一連の静的ファクトリ メソッドを用意することでした。これはヒープ割り当ても意味しますが、トリックはありません。
何か考えや提案はありますか?ライブラリを使用するプログラマーに対して、私は過度に配慮していませんか?
windows - HEAP_NO_SERIALIZE フラグ
前のコード サンプルで HeapCreate 関数を呼び出したとき、サンプル コードの残りの部分はマルチスレッド セーフではないため、HEAP_NO_SERIALIZE フラグを使用しました。
Jeffrey Richter は彼の著書 (C/C++ 経由の Windows) でこの文を書きましたが、
それは奇妙です。
コードがマルチスレッドセーフでない場合、フラグを使用する必要はありませんでした。
バグですか?それとも私は何かを誤解していますか?
winapi - (移植性は別として) malloc と HeapAlloc の間に根本的な違いはありますか?
さまざまな理由から、C ランタイムから Windows ヒープ API を使用するランタイムに移植しようとしているコードがあります。問題が発生しました: malloc
/ calloc
/ realloc
/free
呼び出しをHeapAlloc
/ HeapReAlloc
/ HeapFree
(GetProcessHeap
ハンドル用) にリダイレクトすると、メモリは正しく割り当てられているように見えます (不良ポインターが返されず、例外もスローされません)。移植すると、何らかの理由で「メモリの割り当てに失敗しました」と表示されます。
Microsoft CRT (下でヒープ API を使用) と別の会社のランタイム ライブラリ (下でグローバル メモリ API を使用) の両方でこれを試しました。これらの両方の malloc はライブラリでうまく機能しますが、何らかの理由で、ヒープ API を直接使用すると機能しません。
割り当てが大きすぎないこと (>= 0x7FFF8 バイト) を確認しましたが、そうではありません。
私が考えることができる唯一の問題は、メモリの配置です。そうですか?またはそれ以外に、私が認識していないヒープ API と CRT メモリ API の根本的な違いはありますか?
もしそうなら、それは何ですか?そうでない場合、静的なMicrosoft CRT (Visual Studio に含まれています) がmalloc
/calloc
を呼び出す前に追加の手順を実行するのはHeapAlloc
なぜですか? 違いがあるのではないかと思いますが、それが何であるかはわかりません。
ありがとうございました!
c - インメモリデータ構造の安全なマジックナンバーを検索する
ヒープアロケータ(malloc)を実装しています。マジックナンバーを選択して、指定したポインタが割り当てたデータ構造を指しているかどうかを確認する必要があります。マジックナンバーが完全に安全であるとは考えられないことは私には明らかなようですが(番号をチェックすれば、データ構造の1つを確実に指すことができます)、何かを見逃した可能性があります。夢の数を教えてください、本当にありがたいです。事前にThx。