【发布时间】:2019-06-21 10:07:55
【问题描述】:
考虑以下代码:
int* p1 = new int[100];
int* p2 = new int[100];
const ptrdiff_t ptrDiff = p1 - p2;
int* p1_42 = &(p1[42]);
int* p2_42 = p1_42 + ptrDiff;
现在,标准是否保证p2_42 指向p2[42]?如果不是,在 Windows、Linux 或 webassembly 堆上总是如此吗?
【问题讨论】:
-
甚至不能保证
int对象与sizeof(int)对齐(我知道的所有 ABI 都是这种情况,但几乎所有编程规则都有例外,所以一些 ABI 可能不是那样);如果不是这样,代码显然不能保证工作。 -
@curiousguy 除了性能之外,没有特别的理由不对齐英特尔的字节边界。如果我们在实践中使用
struct i5 { int i[5]; };而不是int,p1和p2将不会与sizeof(i5)对齐。
标签: c++ pointers language-lawyer pointer-arithmetic