Можно ли использовать std :: uintptr_t, чтобы избежать неопределенного поведения арифметики с указателями вне границ?
Теперь мы знаем, что выполнение арифметики вне пределов указателя имеет неопределенное поведение, как описано в этомТАК вопрос.
Мой вопрос: можем ли мы обойти такое ограничение, приведя к std :: uintptr_t для арифметических операций, а затем приведя обратно к указателю? это гарантированно сработает?
Например:
char a[5];
auto u = reinterpret_cast<std::uintptr_t>(a) - 1;
auto p = reinterpret_cast<char*>(u + 1); // OK?
Реальное использование для оптимизации смещенного доступа к памяти - вместоp[n + offset]
, Я хочу делатьoffset_p[n]
.
РЕДАКТИРОВАТЬ Чтобы сделать вопрос более явным:
Учитывая базовый указательp
из массива символов, еслиp + n
является действительным указателем, будетreinterpret_cast<char*>(reinterpret_cast<std::uintptr_t>(p) + n)
гарантированно выдать тот же действительный указатель?