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に準拠したデータ構造のスイートなどの既存の実装にメリットがあるかもしれない - 「あなたの場合の例
Boostの 'offset_ptr <>'は、任意のオフセットを許可するのではなく、オフセットポインタ自体のアドレスと指定されたオブジェクトのアドレスの間の距離を格納します。個人的には、名前が不十分だと思います。 'relative_ptr <>'がより適切でしょう。 – ildjarn
確かに、 '相対アドレス指定'のように。私は通常それを相殺するように言いました。私はそれも大丈夫でした - おそらく私は私の親戚と呼んでブーストと区別することができました。良い提案です。ありがとう。 –