为什么一个接一个声明的两个变量在内存中不相邻?

Why two variables declared one after another are not next to each other in memory?

本文关键字:一个 内存 声明 为什么 两个 变量      更新时间:2023-10-16

我正在使用代码示例来检查两个整数之间的距离,就像这个问题的答案一样。

int i = 0, j = 0;
std::cout << &i - &j;

根据我对内存表示的理解,这两个变量的这些内存地址应该彼此相邻,并且相差应该正好是1。

令我惊讶的是,在VS2017中使用MS编译器运行此代码可打印3,并使用GCC运行相同的代码可打印1。

为什么会这样,VS有问题吗?

C++标准没有要求C++编译器以任何特定方式分配具有自动存储持续时间的变量,包括使它们在内存中连续。事实上,编译器可以选择不为变量分配任何内存,从而完全优化它。

这就是为什么减去指针只有在它们都指向同一数组中的内存或一个元素超过其末尾时才有意义。在所有其他情况下,包括你的情况,你都会得到未定义的行为。

您尝试的指针算术具有未定义的行为:

如果指针 P 指向数组的第 i 个元素,并且 指针 Q 指向同一数组的第 j 个元素,即 表达式 P-Q 的值为 i-j,如果该值符合 std::p trdiff_t。两个操作数必须指向同一数组的元素(或一个 超过结束(,否则行为是未定义的。如果结果确实如此 不适合 std::p trdiff_t,行为未定义。