【问题标题】:Distance between variables in memory内存中变量之间的距离
【发布时间】:2015-03-25 12:44:11
【问题描述】:

我想知道 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 12月:3537480

【问题讨论】:

  • 这是 12 个 字节 而不是位。
  • 您计算的差异是字节数。 C++ 处理变量的方式完全取决于平台、编译器设置。在某些情况下,变量根本不会保存在内存中。
  • 你的问题是什么?
  • 使用该选项显示编译器生成的程序集,并查看它是如何布局内存的。
  • 您的程序有未定义的行为:%p 需要 void * 参数,%d 需要 int 参数。

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


【解决方案1】:

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

【讨论】:

  • 我认为这里不可能。首先,12个字节是变量的起始地址之间的差异,而不是它们之间的间隙长度。其次,十六进制值清楚地表明,这两个变量都不是 16 字节对齐的。 (即最低有效的十六进制数字不为零。)
【解决方案2】:

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

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

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

【讨论】:

  • 理论上,编译器可以决定将指针实现为字符串吗?
  • 实际上,它们必须是固定长度(sizeof(T*) 是一个常数)。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多