【问题标题】:compact offset pointer , existing implementations?紧凑的偏移指针,现有的实现?
【发布时间】:2012-01-07 07:00:01
【问题描述】:

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 中使用的另一种变体是使用来自标头的偏移量,其中对齐会更有用。

我在 boost 中看到了一些关于“进程间库”的东西,它有一个“offset_ptr”,看起来非常相似,所以似乎有一个现有的实现包括这种确切的模式某处。 编写起来很快,但现有实现可能会带来好处,例如围绕相同概念构建的一套相关的 stl 兼容数据结构 - 例如具有 16 位偏移指针和 16 位计数的“近向量”

【问题讨论】:

  • Boost 的offset_ptr&lt;&gt; 与您想要的不同——它存储偏移指针本身的地址和指向对象的地址之间的距离,而不是允许任意偏移。就个人而言,我认为它的名字很糟糕。 relative_ptr&lt;&gt; 会更合适。
  • 当然,就像在“相对寻址”中一样。我通常称它为偏移量,所以我也可以接受 - 尽管也许我可以称我的“相对”以将其与提升区分开来”,好建议。

标签: c++ pointers boost stl


【解决方案1】:

如果您使用的是 Visual C++,您可能希望使用 __based pointers

【讨论】:

  • 谢谢。我不知道那存在。可悲的是,当我主要使用 gcc 和 llvm 编译时,我必须避免 MS 特定的扩展,我想知道 c++11 是否有类似的东西。来自 asm 时代的低级代码,我常用的方法是从结构基础本身偏移,这通常是最方便的。它也可以作为 C 宏很好地工作,但上面的实现在 C++ 中非常诱人。
猜你喜欢
  • 1970-01-01
  • 2010-09-14
  • 2011-01-05
  • 1970-01-01
  • 2021-12-03
  • 2020-05-23
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
相关资源
最近更新 更多