Обычно указатели на x86-64 определены как 8 байтов. Однако, если вы уверены, что у вас есть данные, которые будут только в первых 4 ГБ адресного пространства, то технически достаточное значение 32-разрядного значения. Иногда люди создают
Вы могли бы сделать что-то вроде: < /p>
Код: Выделить всё
struct small_pointer {
uint32_t p;
};
char load_small_pointer(struct small_pointer p, size_t index)
{
return *((char*)p + index);
}
Однако это включает преобразование из uint32_t в (char*) , что, вероятно, является неопределенным поведением. Стандарт позволяет круглые поездки через uintptr_t , но я не знаю ни одного специального пособия для других типов, даже если наши условия выполняются конверсию от Uintptr_t в uint32_t должны быть без потерь. Полем Есть ли какой -нибудь стандартный способ сделать это? Если нет, то предоставляют ли GCC/Clang какие -либо конкретные гарантии реализации? Нельзя необычно для операционных систем для хранения специальных данных в высоком или низком уровне диапазона адресов. Нужно другой тип указателя для некоторых объектов уже естественно в этих ситуациях. Выражение его как смещение в какой -то буфер, выделенный во время выполнения, включал бы дополнительную нагрузку (загрузка адреса из указателя в буфер, затем фактическая нагрузка из смещенного местоположения).
Подробнее здесь:
https://stackoverflow.com/questions/793 ... d-behavior