【发布时间】:2014-03-25 02:36:43
【问题描述】:
现在我们知道,越界指针算术具有未定义的行为,如 SO question 中所述。
我的问题是:我们可以通过转换为 std::uintptr_t 进行算术运算然后转换回指针来解决这种限制吗?可以保证有效吗?
例如:
char a[5];
auto u = reinterpret_cast<std::uintptr_t>(a) - 1;
auto p = reinterpret_cast<char*>(u + 1); // OK?
现实世界的用途是优化偏移内存访问——而不是p[n + offset],我想做offset_p[n]。
编辑使问题更明确:
给定一个 char 数组的基指针 p,如果 p + n 是一个有效指针,是否保证 reinterpret_cast<char*>(reinterpret_cast<std::uintptr_t>(p) + n) 产生相同的有效指针?
【问题讨论】:
-
也许应该注意的是,在重要的平台上,现代编译器会为您优化,而在大多数其他平台上,可以在计算有效地址时添加一个小的偏移量,因此没有开销。
标签: c++ pointers pointer-arithmetic