Я совсем недавно работаю с С++ и не понял всех тонкостей и тонкостей языка.
Какой самый портативный, правильный и безопасный способ добавить произвольное смещение байта в указатель любого типа в С++ 11?
SomeType* ptr;
int offset = 12345 /* bytes */;
ptr = ptr + offset; // <--
Я нашел много ответов на Qaru и Google, но все они предлагают разные вещи. Некоторые варианты, с которыми я столкнулся:
-
ptr = (SomeType*)(((char*)ptr) + offset);
-
Вставить в
unsigned int
:ptr = (SomeType*)((unsigned int)ptr) + offset);
-
ptr = (SomeType*)((size_t)ptr) + offset);
-
"Размер
size_t
иptrdiff_t
всегда совпадает с размером указателя. Из-за этого именно эти типы должны использоваться как индексы для больших массивов, для хранения указателей и арифметики указателей." - О size_t и ptrdiff_t в CodeProjectptr = (SomeType*)((size_t)ptr + (ptrdiff_t)offset);
-
Или как предыдущий, но с
intptr_t
вместоsize_t
, который подписан вместо unsigned:ptr = (SomeType*)((intptr_t)ptr + (ptrdiff_t)offset);
-
Лишь только
intptr_t
, так какoffset
уже является целым знаком иintptr_t
неsize_t
:ptr = (SomeType*)((intptr_t)ptr) + offset);
И во всех этих случаях безопасно ли использовать старые приведения в стиле C, или это более безопасно или более переносимо для использования static_cast
или reinterpret_cast
для этого?
Должен ли я предположить, что значение указателя само является неподписанным или подписанным?