'reinterpret_cast<char*>(<uintptr_t>reinterpret_cast(&ch) + 1) == &ch +1' 保证吗?

Is `reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(&ch) + 1) == &ch +1` guaranteed?

本文关键字:gt ch lt reinterpret cast uintptr char      更新时间:2023-10-16

我正在编写与对齐相关的代码,很惊讶没有标准的函数来测试给定指针是否正确对齐。

互联网上的大多数代码似乎都使用(long)ptrreinterpret_cast<uintptr_t>(ptr)来测试对齐,我也使用了它们,但我想知道使用指向整型的强制指针是否符合标准。

有没有任何系统在这里触发断言?

char ch[2];
assert(reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(&ch[0]) + 1)
       == &ch[1]);

回答标题中的问题:不。

反例:在旧的Pr1me迷你电脑上,一个正常的指针是两个16位的字。第一个字是12位的段号,2个环形位和一个标志位(记不住第16位)。第二个字是一个段内的16位字偏移量。char*(因此是void)需要第三个单词。如果设置了标志位,则第三个字为0或8(是被寻址字内的位偏移量)。用于这种机器的uintptr_t将需要是uint48_tuint64_t。无论哪种方式,在这样的整数上加1都不会前进到内存中的下一个字符。

能力寻址的机器也可能具有比地址空间大得多的指针,并且没有特别的理由说明为什么相应整数的最低有效部分应该是"地址"的一部分,而不是额外信息的一部分。

当然,在实践中,没有人为Pr1me编写C++,而能力寻址机器似乎也没有出现。它可以在所有真实的系统上工作,但标准并不能保证它。