問題タブ [sbrk]
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.
pointers - メモリ(sbrk)ポインタアクセスでの16バイト整列シフト
私はsbrkを使用してかなり基本的なメモリアロケータを作成しました。私はメモリのチャンク、たとえば65kを要求し、動的メモリを要求する変数の必要に応じてそれを切り分けます。65kブロックに追加してメモリを解放します。65kブロックは、ユニオンsizeof(16バイト)から派生します。次に、ブロックを16バイトの境界に沿って整列させます。しかし、私は異常な行動をとっています。
データ構造を割り当ててデータ構造にデータを入力し始めると、メモリへのアクセスは正常に表示されます。関数呼び出しの1つで、グローバル構造のメンバー変数へのポインターを渡しますが、ポインター引数のアドレスは直接マップされません。そのメンバーのアドレス。
たとえば、この特定のメンバーの実際のアドレスはたまたま0x100313d50ですが、特定の機能(特別なことは何もありません)を実行すると、メンバーのアドレスは0x100313d70として表されます。デバッガー内で実際のアドレスを照会できますが、これが現れる関数内では正しく表示されます。これも最初にアクセスされるメンバーではなく、3番目であるため、2回前のメモリアクセスで問題ありませんが、3回目のアクセス中に、この異常なシフトが見られます。
ずれたブロックを介してこのメモリにアクセスしている可能性はありますか?可能ですが、SIGBUS例外がスローされることを期待しています(SPARCチップ)。-memalign = 16sを使用してコンパイルしているので、ミスアライメントをトラップして修正するのではなく、SIGBUSを使用する必要があります。
私のすべての構造体は16バイトの倍数で埋められています:sizeof(structure)%16 =0。このタイプの動作を経験した人はいますか?一般的に言って、どんな種類のもの/もの/など。ポインタがメモリアドレスを誤って表現する可能性がありますか?
乾杯、トレーシー。
Solaris 10、SunStudio-12、最新のSPARCプロセッサ上のC言語(これが役立つ場合)。
c - C でのメモリ割り当て
以下はmalloc()の非常に単純なバージョンであり、いくらかのスペースを割り当てているように見えますが、free() がなく、割り当てられたスペースをオーバーランしたかどうかを確認しないという事実を除けば、どうすればよいでしょうかコードが正しいことを確認しますか?
「C」の専門家が私を平手打ちする明らかな失敗はありますか?
c - sbrk()によって取得されたメモリを解放するにはどうすればよいですか?
sbrk()を使用してメモリを取得するカスタムアロケータ関数があります。このメモリが不要になったときに解放するにはどうすればよいですか?
malloc()のfree()と同等の関数はありますか?
または、データセグメントの終わりを設定するためにbrk()を使用する必要がありますか?
c++ - sbrk() は C++ でどのように機能しますか?
どこsbrk()
で詳細を読むことができますか?
それはどのように正確に機能しますか?
面倒なandsbrk()
の代わりにどのような状況で使用したいですか?malloc()
new()
ところで、拡張は何のためsbrk()
ですか?
macos - Mac OS Xアセンブリでどのように動的にメモリを割り当てますか?
標準Cライブラリにリンクしないアセンブリプログラムからメモリを動的に割り当てたいと思います。brk(2)とsbrk(2)はMac OS X(10.6.2)では使用できないので、代替手段は何ですか?
(マッハ呼び出しが含まれていると思いますが、その周りのドキュメントはほとんどないようです)
c - malloc() は内部でどのように実装されていますか?
malloc()
内部でどのように機能するかを説明できる人はいますか?
私は時々やったことがありますがstrace program
、多くのsbrk
システムコールを見て、man sbrk
それが使用されていることについて話していますmalloc()
が、それ以上ではありません。
c - Cでsbrk()にintptr_tとintを渡すことの違いは何ですか?
sbrk の機能には影響がないようですが、sbrk() のドキュメントでは intptr_t パラメータが必要であると書かれています。
int型をパラメーターとして渡すと機能します(または少なくとも機能するようです)。
これは通常の C です。
c - C のメモリ アロケータ -- sbrk() の領域を利用する方法
私は malloc の実装を書いていて、誰かがこの問題を手伝ってくれるかどうか疑問に思っていました。
基本的にはsbrk()でメモリを確保し、メモリが空いていることを確認してから再利用したい。
つまり、基本的に、私の記憶がこのようになっていると想像してください
...そして、いくつかの割り当てを行います。メモリを割り当てると、各ビットにヘッド (h) とデータ (d) があります。
これでこれらの穴ができました。たとえば、ダイアグラムの最初のギャップを使用したい場合、ヘッド (h) とボディ (dd) も持つように設定するにはどうすればよいでしょうか?
必要なメモリ位置へのポインタを取得したところまで来ました。C では、ポインターによってポイントされます。ポインターにはカスタム型があり、「メタ」は私が定義した構造体です。だから今私は持っています
しかし、私がやろうとすると
または
セグメンテーション違反が発生します。
質問: sbrk() を介して割り当てられたメモリ アドレスが構造体の形式になるように設定するにはどうすればよいですか? 明らかに、私は単に myPointer = malloc(sizeof(metaStruct)) に行くことはできません。なぜなら、私は malloc 自体を書いているからです。sbrk() でより多くのスペースを使用することにも興味がありませんが、私が指摘している既存のスペースを利用することには興味があります (ジャンク データを無視してスペースを使用したい)。
どうすればそれを行うことができますか?
c - mmap と sbrk、パフォーマンス比較
これらの呼び出しのうち、平均して速いのはどれですか? mmap
小さい割り当ての方が速いと聞いたことがありますが、どちらも比較したことはありません。これらのパフォーマンスに関する情報があればいいでしょう。