将指针转换为整数、递增该整数并返回是否安全?
Is it safe to cast pointer to integer, increment that integer, and cast back?
假设我有一个有效的指针p0
:
T a[10];
T* p0 = &a[0];
我知道我可以像这样安全地往返投射它:
reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0)) == p0;
但是执行以下操作安全吗?
T* p1 = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0) + sizeof(T));
即我可以确定没有 UB 并且 p1 == &a[1]
?
这是实现定义的行为。您的编译器应该记录指针算术是否等同于指针转换后的数值的整数算术。在具有 "flat" 字节寻址内存 space 的现代计算机上应该就是这种情况;但不能保证在所有平台上都可移植。
使用 char*
而不是 uintptr_t
将可移植,只要您留在数组内并确保指针在转换回之前正确对齐 T
。
假设我有一个有效的指针p0
:
T a[10];
T* p0 = &a[0];
我知道我可以像这样安全地往返投射它:
reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0)) == p0;
但是执行以下操作安全吗?
T* p1 = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(p0) + sizeof(T));
即我可以确定没有 UB 并且 p1 == &a[1]
?
这是实现定义的行为。您的编译器应该记录指针算术是否等同于指针转换后的数值的整数算术。在具有 "flat" 字节寻址内存 space 的现代计算机上应该就是这种情况;但不能保证在所有平台上都可移植。
使用 char*
而不是 uintptr_t
将可移植,只要您留在数组内并确保指针在转换回之前正确对齐 T
。