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