Я пишу код, зависящий от выравнивания, и совершенно удивлен тем, что нет стандартного тестирования функции, если данный указатель правильно выровнен.Является `reinterpret_cast <char*> (reinterpret_cast <uintptr_t> (& ch) + 1) == & ch + 1` гарантировано?
Похоже, что большинство кода в Интернете используют (long)ptr
или reinterpret_cast<uintptr_t>(ptr)
, чтобы проверить выравнивание, и я также использовал их, но мне интересно, является ли использование литого указателя интегральным типом стандартным.
Есть ли какая-либо система, которая вызывает это утверждение здесь?
char ch[2];
assert(reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(&ch[0]) + 1)
== &ch[1]);
Как это выражение проверяет выравнивание? – MikeMB
Могут быть некоторые системы, в которых код не компилируется, так как опционально определяется 'uintptr_t'. * «Беззнаковый целочисленный тип, способный удерживать указатель» *, не требуется. –
@MikeMB Это выражение не используется для проверки выравнивания, но выравнивание проверяется с помощью LSB указателя переинтерпретации, поэтому я считаю, что выражение является необходимым условием проверки выравнивания. – kukyakya