Офтет указателя базового класса и движущиеся объектыC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Офтет указателя базового класса и движущиеся объекты

Сообщение Anonymous »

Я разрабатываю распределитель памяти, который способен перемещать объекты в течение их жизни. Чтобы поддержать это, требуется использование косвенного положения , который указывает на управляющий блок. Этот управляющий блок указывает на истинное местоположение объекта и обновляется, если распределитель памяти хочет переместить объекты. Я придумал следующее решение, проверив смещение между основанием и полученными указателями, сохранив его и настраивая указатель блока памяти с помощью этого смещения. В частности, хранит ли смещение вместе с указанным поведением, включающим в себя какие-либо потенциальные случаи края?struct ControlBlock
{
void* ptr;
};

template
class IndirectPointer
{
public:

// Constructor used immediately after object allocation
IndirectPointer(ControlBlock* control_block) :
control_block(control_block),
offset(0)
{
}

// Allow indirect pointers to base clases
template
IndirectPointer(const IndirectPointer& r) requires std::is_base_of_v :
control_block(r.control_block)
{
if (const Derived* ptr = r.try_get())
{
offset = r.offset + reinterpret_cast(static_cast(ptr)) - reinterpret_cast(ptr);
}
}

// Access value
T* try_get() const
{
if (control_block && control_block->ptr)
{
return reinterpret_cast(static_cast(control_block->ptr) + offset);
}
return nullptr;
}

private:

template
friend class IndirectPointer;

ControlBlock* control_block;
std::ptrdiff_t offset;
};

int main()
{
struct X {
~X() = default;
virtual void foo() = 0;
};
struct Y : X {
void foo() override {}
};

// Minimal code to show intented behaviour:

// Create object
Y object;
ControlBlock cb { &object };
IndirectPointer pointer{ &cb };
IndirectPointer base_pointer{pointer};

// Move object
Y object_new_location{ std::move(object) };

// Update control block pointer
cb.ptr = &object_new_location;

// Pointer now points to new object
assert(pointer.try_get() == &object_new_location);
assert(base_pointer.try_get() == &object_new_location);
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... ng-objects
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»