首页 > 解决方案 > 为什么一个接一个声明的两个变量在内存中不相邻?

问题描述

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

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

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

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

为什么会发生这种情况,VS有问题吗?

标签: c++visual-studiogccmemory

解决方案


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

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


推荐阅读