Подтвердить что ты не робот

С++ offsetof char * арифметика

В этот ответ, int8_t* используется для (байт) арифметики указателя:

std::size_t offset = offsetof(Thing, b);
Thing* thing = reinterpret_cast<Thing*>(reinterpret_cast<int8_t*>(ptr) - offset);

Я всегда использовал char* в прошлом, но комментарии действительно сбивают с толку, и никто не ответил, поэтому я разместил этот отдельный вопрос.

Является ли char* действительным и предпочтительным способом выполнения этих вычислений?

4b9b3361

Ответ 1

Вы должны использовать char*: поведение при использовании reinterpret_cast с int8_t* на указателе на то, что не является int8_t, равно undefined. Кастинг в char* можно рассматривать как исключение из правила.

Pre С++ 14, char может быть 1 дополняющим типом с диапазоном от -127 до +127. int8_t должно быть 2 дополнения. Даже С++ 14 и далее, я не вижу, почему типы связаны: char может по-прежнему быть либо подписанным, либо беззнаковым типом.