Существует ли шаблон в 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);
}
//...
};
Это то, что я обычно создавал в прошлом (компактные, предварительно скомпилированные кеш-структуры данных), например, для данных, разбитых на порции по 128 КБ OFFSET = short
Другой вариант, который я бы использовал в древних C #defines, использовал бы смещения из заголовка, где выравнивания были бы более полезными.
Я видел кое-что о «межпроцессной библиотеке» в boost, имеющей «offset_ptr», которая выглядит очень похоже, поэтому вполне вероятно, что существует существующая реализация, включающая этот точный шаблон где-то .Это быстро написать, но у существующей реализации могут быть преимущества, такие как набор связанных структур данных, совместимых со стандартом STL, построенных по одной и той же концепции - «ближний вектор» с 16-битным указателем смещения и 16-битным счетчиком, например