在 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 以下 block 的数据 OFFSET=short
我在古老的 C#defines 中使用的另一个变体将使用 header 的偏移量,其中对齐会更有用。
我在 boost 中看到了一些关于“进程间库”的东西,它有一个“offset_ptr”,看起来非常相似,所以看起来很可能有一个现有的实现包括这个确切的模式某处。 它编写起来很快,但现有的实现可能会有好处,例如围绕同一概念构建的一套相关的 STL 兼容数据结构——例如,具有 16 位偏移指针和 16 位计数的“近 vector ”
最佳答案
如果您使用的是 Visual C++,您可能喜欢使用 __based
pointers .
关于c++ - 紧凑的偏移指针,现有的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8285332/