可以使用以下表达式来查找下一个正确对齐的地址:
(address + alignment - 1u) & ~(alignment - 1u)
但是,为了执行此操作,需要将地址转换为
uintptr_t
(void*
和 char*
不行)。
这是否违反了严格别名?如果是这样,如何在不违反规则的情况下实施? (我知道禁用严格别名的编译器标志。我要求遵守该规则,而不是禁用它。)
严格的别名在这里无关紧要。但是通过将指针转换为整数产生的值是实现定义的。使用
std::align
可以便携式地执行此操作。