В C / C ++ вы можете интерпретировать числа как указатели любым удобным для вас способом - но это означает, что вы не сможете просто разыменовывать / добавлять / вычитать и делать другие обычные операции с указателями.Вместо этого вам придется использовать функции, конвертирующие в «истинный» указатель, для выполнения таких операций.
В C ++ вы можете очень аккуратно обернуть все это внутри класса, который представляет интерфейс, похожий на указатель, реализуя1003 *, opeartor->
и арифметические операторы.
Так, на основе взгляда на рисунок 2, может выглядеть реализация предложенных указателей (обратите внимание, что если вы на самом деле делаете это, то вы 'мы хотим убедиться, что класс все равно не дополняется до 32 или 64 битов, и что они размещены на 2-байтовых границах - обычно для этого есть специфичные для компилятора директивы.)
class SmallChildPointer{
public:
SmallChildPointer(Child* bigChildPointer)
: value(){
ptrdiff_t offset = bigChildPointer - base_address;
if(offset > 0x7fff)
throw std::runtime_error("too big for a near pointer...");
value = uint16_t(offset & 0x7fff);
}
Child* operator->() const{
return (Child*)(base_address + value);
}
Child const& operator*() const{
return *(Child const*)(base_address + value);
}
Child& operator*(){
return *(Child*)(base_address + value);
}
// do this once, before constructing any of these!
static void setTheGlobalBaseAddress(void* here){
base_address = here;
}
private:
uint16_t value;
static void* base_address;
};