2011-11-27 14 views
5

stl、boost、または他のLGPLオープンソースツールキットに、以下のように正確に動作するテンプレートがあります: -
- カスタムアラインメントを持つ相対ポインタ、範囲を減らすためのより少ないビットを格納するオプション。 説明するための可能な実装: -コンパクトオフセットポインタ、既存の実装?

template<typename T, typename OFFSET=int, 
    int ALIGN_SHIFT=2> 
class OffsetPtr 
{ 
    OFFSET ofs; 

public: 
    T* operator->() { 
     return (T*) (((((size_t)this)>>ALIGN_SHIFT)+ofs)<<ALIGN_SHIFT); 
    }; 
    void operator=(T* src) { 
     size_t ofs_shifted = (((size_t) src)>>ALIGN_SHIFT) - (((size_t) this)>>ALIGN_SHIFT); //asserts.. 
     ofs = (OFFSET) (ofs_shifted); 
    } 
    //... 
}; 

その私が日常例えば、(コンパクトキャッシュフレンドリープリコンパイルされたデータ構造)、過去に作成することになり、何かをサブ128kチャンクに分割されたデータOFFSET = short
古代C#definesで使用するもう1つのバリエーションは、アライメントがより有用なヘッダーからのオフセットを使用します。

私は 'offset_ptr'を持つboostで 'プロセス間ライブラリ'について何か見てきました。これは非常によく似ているので、この正確なパターンのような既存の実装があるようです。 はそれを書くのは速いですが、同じ概念を中心に構築された関連するSTLに準拠したデータ構造のスイートなどの既存の実装にメリットがあるかもしれない - 「あなたの場合の例

+0

Boostの 'offset_ptr <>'は、任意のオフセットを許可するのではなく、オフセットポインタ自体のアドレスと指定されたオブジェクトのアドレスの間の距離を格納します。個人的には、名前が不十分だと思います。 'relative_ptr <>'がより適切でしょう。 – ildjarn

+0

確かに、 '相対アドレス指定'のように。私は通常それを相殺するように言いました。私はそれも大丈夫でした - おそらく私は私の親戚と呼んでブーストと区別することができました。良い提案です。ありがとう。 –

答えて

2

ためのポインタ& 16ビット数をオフセット16ビットと「近いベクトル」 Visual C++を使用している場合は、__based pointersを使用することをお勧めします。

+0

私はそれが存在するのか分からなかった。残念ながら私はgccとllvmでコンパイルするときにMS固有の拡張を避けなければなりません。 asmの時代に低レベルのコードから戻ってきた私の通常の方法は、通常は最も便利な構造体そのものからのオフセットでした。それはCマクロとしてもうまくいきましたが、上記の実装はC++で非常に魅力的でした。 –

関連する問題