компактный указатель смещения, существующие реализации? - PullRequest
5 голосов
/ 27 ноября 2011

Существует ли шаблон в 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-битным счетчиком, например

1 Ответ

2 голосов
/ 05 декабря 2011

Если вы используете Visual C ++, вы можете использовать __based указатели .

...