2010-12-06 11 views
8

最近、私は新しい友達を作った。彼の名前は_expandで、私たちは素敵な会話をしてくれました。しかし、私が尋ね始めたとき、誰も私の援助を聞いたことはなかった。私は疑わしくなった。私は、マイクロソフトではあまり比喩的ではない友人をいくつか呼び、ビジネスの他のいくつかの友人に電話しました。何もない。誰もそれを使ったことはありませんでした。私はさまざまな検索エンジンとソースツリーの周りに立ち寄った。ここにはあまり言い訳がありません。確かに、生産コードやそれに関連するgenericライブラリに_expandを導入するためのパフォーマンスと互換性に関する情報は十分ではありません。_新しいGNU対GNU

さらに悪いことに、私はgnuライブラリのいずれかで見つけることのできる同等の機能はないので、私の新しい友達とハッキングするものは、少なくとも移植性がないとは限りません。それは本当に魅力的でエキサイティングなものですから、残念です。確かに、私はreallocを掘り下げてどのように機能するのかを解明することができましたが、実装の多くは* nixesで非常に可変です。だから私は、移植可能な_expandを試してみるためにバージョンの後にバージョンをコードしなければならないだろう。それでもglibや拡張されたgnu libsには何も似ていないことはばかげているようです。

  1. Linuxのハッキングについて知っておくべき機能はありますか? ほとんどの回答
  2. 私は同様の機能を構築することができる標準的なフックはありますか? 回答あり
  3. _expandが提供するパフォーマンスは誰にも分かりますか?
  4. LFHに割り当てられたオブジェクトとはどのように対話しますか?

私は、従来のdeque実装の行に沿って複数の要素のブロックを割り当てながら、断片化を最小限に抑えるために展開する単一リンクアキュムレータを構築しようとしています。要素の追加と削除のユースケースを制約することで、要素の挿入と索引付けだけでなく、構造全体の削除時間を最適化したいと考えています。その結果、_expandの「大きな失敗」は、いつ、どこでサイズを変更できるのか、それがデータをどこに置くことができるのかを知的に考えさせることができます。

+8

素敵な文章様式。今殺す私たちのすべてのために。早く。 – dmckee

+0

誰もそれを使用していない理由はおそらくあります。 –

+4

+1すてきな文学的スタイル。私は彼らが好き。 – Thilo

答えて

3

C++はnewdeleteで処理されています。reallocには、これらの処理にはほとんど注意を払っていません。 OSレベルでも一貫して利用できない場合は、珍しい_expandはほとんど無視されます。独自のロールを作成したい場合は、mallocのユーザ定義バージョンの前例がたくさんあります。私のLinuxボックスの/usr/include/malloc.hには、このためのフックが明示されています。

/* Called once when malloc is initialized; redefining this variable in 
    the application provides the preferred way to set up the hook 
    pointers. */ 
extern void (*__malloc_initialize_hook) __MALLOC_PMT ((void)); 
/* Hooks for debugging and user-defined versions. */ 
extern void (*__free_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr, 
             __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__malloc_hook) __MALLOC_PMT ((size_t __size, 
                __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__realloc_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr, 
                size_t __size, 
                __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__memalign_hook) __MALLOC_PMT ((size_t __alignment, 
                 size_t __size, 
                 __const __malloc_ptr_t)); 
extern void (*__after_morecore_hook) __MALLOC_PMT ((void)); 

既存のreallocの実装をその特定の意思決定ポイントで傍受することはできませんが、インプレースでサイズ変更するかどうかを簡単に把握できるため、すべてを再実装する必要があります。ヒープ実装)。

+1

私は新しく削除しても大丈夫ですが、ヒープを調べる方法がない限り、この特定の問題はうまく解決しません。このためにありがとう、なぜ私はmalloc.hをチェックし、ニンニーズのビットを感じるとは思わなかったか分からない。これらのフックがポータブルで標準的であるかどうか、ご存じですか? 1つはそれらがあると思いますが、かなり頻繁に十分に焼かれました。 –

+0

@Jake:残念ながら、彼らはGNU libCに固有のものだと思います。より移植性が必要な場合は、電気フェンスなどのmallocデバッグライブラリを見て、どのようにメモリ割り当てルーチンを傍受するかを見てください。 1つのアプローチは、LD_PRELOADを使用して、メモリ割り当てルーチンのオーバーライドを提供するライブラリを指定することです。これは非常に簡単です(私の古い回答の1つがこれについて説明しています - http://stackoverflow.com/questions/3410990/ld-pre-c-class-methods/3411412#3411412 +私の(唯一の)質問を参照してください)、Windowsで同様のことをする方法がわかりません。 –

+0

GNU libCで十分でしょう今のところ、私は思う...私はいくつかのもっと秘密のmallocをサポートしたいと思います。私はこれが価値があると思うが、私はそれをする人になることを少し心配している。 –