内存中变量之间的距离

时间:2015-01-27 00:38:29

标签: c++ memory reference 64-bit addressof

我想知道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;
}

输出:

int:    4
unsigned int:   4
Address of x
        Hex:    0035FA54
        Dec:    3537492
Address of y
        Hex:    0035FA48
        Dec:    3537480

3 个答案:

答案 0 :(得分:1)

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

这也不例外:你得到的数字是12,巧合。如果你试图计算它&#34;蓝&#34;在技​​术上是一个法律结果。这是因为比较不相关的指针是未定义的行为,然后确实会发生任何事情。

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

答案 1 :(得分:1)

我的 guess 将是编译器为了某些性能原因而沿着字边界对齐整数。如果一个字是128位或16字节,那么这种行为将导致变量之间的距离为12个字节。你需要更多地了解你正在编译的架构,以了解我是否正确。没有双关语。见http://en.wikipedia.org/wiki/Data_structure_alignment

答案 2 :(得分:1)

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