根据[basic.align]
我希望C++编译器可以假定任何指向T的指针都指向正确对齐的T。
例如(如果alignof(int)== 4)
int* p = /* ... */
auto val = p[0];
if ((reinterpret_cast<std::uintptr_t>(p) & 3) != 0) {
// assumed to be unreachable
}
但是,在编译器资源管理器中测试GCC和clang时,我看不到它们都做出了这一假设。 即使我取消引用了指针(如果未正确对齐,它肯定会导致UB),也不会进行此指针值假设。
我认识到指针到整数值的映射是实现定义的,也许编译器具有此代码所假定的映射以外的映射(尽管我不这么认为)。
我还认识到,通过进行此假设可能会破坏生产中的许多代码,并解释了为什么这些编译器当前不这样做。
我的问题是:根据标准,编译器可以做出一个有效的假设吗?
如果没有,请引用标准!
编辑:澄清了指针被取消引用。
EDIT2:说alignof()(而不是sizeof())
最佳答案
是的,编译器可能会假定指针已正确对齐。
让我们暂时假设有一个函数is_aligned
,它测试指针所指向的地址是否针对其类型正确对齐。
int* p = /* ... */
auto val = p[0];
if (is_aligned(p)) {
// assumed to be unreachable
}
然后将是真实的。我们从[basic.life]推论得出因此,不存在对齐不正确的对象。 It then follows指针是空指针,无效或指向其他类型的对象。
通过空指针访问是非法的,access through invalid pointers也是非法的,access to an object of another type†也是非法的,这使得可以通过未对齐的指针UB进行访问。
†,但
unsigned char
,char
和std::byte
除外关于c++ - 根据对齐要求进行优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49597586/