我正在编写与对齐相关的代码,并且非常惊讶于如果给定指针正确对齐,则没有标准函数测试。
互联网上的大多数代码似乎都使用(long)ptr
或reinterpret_cast<uintptr_t>(ptr)
来测试对齐,我也使用过它们,但我想知道使用带有整数类型的转换指针是否符合标准。< / p>
是否有任何系统可以触发断言?
char ch[2];
assert(reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(&ch[0]) + 1)
== &ch[1]);
答案 0 :(得分:4)
回答标题中的问题:否。
计数器示例:在旧的Pr1me小型计算机上,普通指针是两个16位字。第一个字是12位段号,2个环位和一个标志位(不记得第16位)。第二个字是段内的16位字偏移。 char *(因此void *)需要第三个单词。如果标志位置1,则第三个字为0或8(是寻址字内的位偏移)。此类计算机的uintptr_t
必须为uint48_t
或uint64_t
。无论哪种方式,将1添加到这样的整数都不会前进到内存中的下一个字符。
能力寻址机器也可能有比地址空间大得多的指针,并且没有特别的理由说明为什么相应整数的最低有效部分应该是“地址”的一部分而不是“地址”的一部分。额外信息。
当然,在实践中,没有人为Pr1me编写C ++,并且能力寻址的机器似乎也没有出现。它适用于所有真实系统 - 但标准并不能保证它。