2011-11-27 52 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#定义中使用的另一种变体将使用标题中的偏移量,其中对齐将更有用。

我已经看到一些关于“间图书馆”在具有“offset_ptr”,看起来非常相似的提升,所以它很可能有一个现有的执行,包括这个确切的模式地方。 它的快速写,但有可能是像一套围绕着同一个概念建立相关的STL兼容的数据结构的现有实现的好处 - 一个“近矢量”与16位偏移指针&例如16位计数

+0

Boost的'offset_ptr <>'与您想要的不同 - 它存储偏移指针本身的地址和指向对象的地址之间的距离,而不是允许任意偏移量。就我个人而言,我认为它名字不好。 'relative_ptr <>'会更合适。 – ildjarn

+0

当然,就像'相对寻址'一样。我通常会把它叫做抵消,所以我也可以这么做 - 尽管也许我可以称之为'相对'来区分它与提升',好的建议。 –

回答

2

如果”重新使用Visual C++,您可能会喜欢使用__based pointers

+0

谢谢。我不知道那是存在的。可悲的是,我必须避免MS特定的扩展,因为我主要用gcc和llvm进行编译,不知道C++ 11是否有类似的东西。在asm的时代,从低级代码回来,我通常的方法是从结构基础本身的偏移,这通常是最方便的。它也可以很好地用作C宏,但上面的实现在C++中非常诱人。 –