3

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

3 回答 3

1

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

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

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

于 2015-01-27T00:52:27.703 回答
1

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

于 2015-01-27T01:18:41.820 回答
1

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

于 2018-01-14T17:21:28.307 回答