Как добавить умным указателям в C++ дополнительный адрес
Есть процессор ARM с дополнительными аппаратными модулями для ускорения отдельных операций. Проблема в том, что они требуют два адреса для работы: виртуальный и физический. При выделении и освобождении памяти они выдаются парой:
uint64_t phyaddr;
void * virtaddr;
// Выделим 100500 байт
hw_alloc(&phyaddr, &virtaddr, 100500);
// скопируем откуда-то через DMA
dma_copy(phyaddr, virtaddr, phyaddr2, virtaddr2);
// освободим память
hw_free(phyaddr, virtaddr);
Хотелось бы хранить оба этих адреса в одном объекте и, при этом, пользоваться умными указателями. Можно ли как-то штатным образом расширить или переопределить их, чтобы добавить поле с физическим адресом, аллокатор и деаллокатор через подобные сишные функции? Чтобы оно могло быть хотя бы каким-то таким:
shared_hw_ptr<obj> ptr = make_shared_hw<obj>();
dma_copy(ptr->get(), ptr->getphy(), phyaddr2, virtaddr2);
Ответы (1 шт):
Чтобы не создавать лишний оверхед и не тратить память на хранение указателя на структуру, придется раздобыть исходники std::shared_ptr | qniqie_ptr и написать свое, подсматривая в них.