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

meJ*_*rew 1 c++ memory gcc visual-studio

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

int i = 0, j = 0;
std::cout << &i - &j;
Run Code Online (Sandbox Code Playgroud)

从我对内存表示形式的理解来看,这两个变量的这些内存地址应该彼此相邻,并且差值应恰好为1。

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

为什么会发生这种情况,VS出了点问题?

das*_*ght 5

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

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