内存中变量之间的距离

Distance between variables in memory

我想知道 C++ 是如何处理变量的,以便一个接一个地声明和初始化的整数变量在内存中的两个地址之间的距离是 3537492 - 3537480 = 12(我假设位(?))

#include <cstdio>

using namespace std;

int main( int argc, char ** argv )
{
    int x = 1;
    int y = 2;

    printf("int:\t%d\n", sizeof(int));
    printf("unsigned int:\t%d\n", sizeof(unsigned int));

    printf("Address of x\n\tHex:\t%p\n\tDec:\t%d\n", &x, &x);
    printf("Address of y\n\tHex:\t%p\n\tDec:\t%d\n", &y, &y);

    return 0;
}

输出:

整数:4
无符号整数:4
x的地址
        十六进制:0035FA54
        十二月:3537492
y的地址
        十六进制:0035FA48
        十二月:3537480

内存中两个变量之间的距离通常是一个无意义的数字。主要的例外是两个数组元素。

这也不例外:你得到的数字是 12,很巧。如果您尝试计算它 "blue" 从技术上讲是合法的结果。那是因为比较不相关的指针是未定义的行为,然后实际上任何事情都可能发生。

此外,您获得的值可能与 运行 运行 不同。 (在许多现代操作系统上,出于安全原因,情况就是如此。当程序一直在移动时,很难破解它)

我的 猜测 是编译器出于某些性能原因将整数沿字边界对齐。如果一个字是 128 位或 16 个字节,那么这种行为将导致变量之间有 12 个字节的距离。您必须更多地了解您正在编译的架构才能知道我是否正确。没有双关语的意思。参见 http://en.wikipedia.org/wiki/Data_structure_alignment

我想你在 Visual Studio Debug 配置中编译了这段代码。在这种模式下,编译器会在您的变量之间进行额外的内存分配,以检测可能的堆栈损坏。尝试切换到 Release,你会看到距离变成了 4 个字节。 有关该主题的更多信息: https://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx