【问题标题】:How are the names/memory addresses of variables represented at the bit level?变量的名称/内存地址如何在位级别表示?
【发布时间】:2012-01-31 16:59:59
【问题描述】:

这可能是一个愚蠢的问题,但我对编程还很陌生,所以请耐心等待。

为了争论,我说的是用 C 语言编码...

我了解(取决于系统)一个 int 占用 4 个字节或 32 位内存。

但是,这里有两件事让我感到困惑。这块内存有一个与之关联的特定内存地址(假设也是 32 位),如果将这个 int 存储在一个变量中,那么它也有一个与之关联的名称。

例如int myInt = 5;

我的问题是 - 内存地址和变量名称在位级别如何以及在哪里表示?编译代码时,编译器是否基本上说:“Ok myInt 指的是地址 0xffffff”并实质上替换了机器代码中的内存地址?即使是这种情况,我仍然对内存地址本身的表示方式感到困惑......

我希望我的困惑所在已经足够清楚了!

【问题讨论】:

    标签: c variables memory-address


    【解决方案1】:

    理论上,答案是“它依赖于实现”。每个 C 编译器都会决定采用的最佳方法——只要它表现出正确的行为,你如何到达那里并不重要。

    实际上,您可能不会在已编译的程序中看到对变量名的引用。这是因为处理器不需要知道或关心您为执行程序而分配的变量名。它在低得多的层次上运行:它只需要了解要执行哪些指令以及执行顺序。因此,包含这些信息是多余的,只会夸大程序的大小。

    我将在下面列举三种基本情况。我还将描述典型编译器可能会执行的行为,但请记住,它依赖于实现,并且通常编译器可以做任何他们想做的事情,只要它们表现出正确的标准行为。

    • 对于局部变量,作为编译过程的一部分,编译器会将每个变量名称(例如“int foo;”)替换为对分配给该变量的适当内存(“内存地址 0x482c”)的引用。对该值的赋值或引用通常只能引用适当的地址。

    • 对于非局部变量,编译器会执行额外的解析来确定如何发现,但通常仍然不会直接存储变量或函数的名称。

    • 对于根本不是变量的事物(结构、方法等),编译器会根据其做出的决策和已设置的参数执行不同的解析步骤和优化。但在这里,它也不存储变量或函数的名称;它只是用适当的引用替换它。

    在某些情况下,在编译器的输出中包含变量名很有用,例如在调试时。在这些情况下,会创建一个调试符号表。这是一种将 addresses 映射到对人类有意义的 names 的方法,因此当某些东西崩溃时,您可以看到“Stacktrace: function foo() ...” “堆栈跟踪:内存地址 0x4572 ...”。

    在具有元编程功能的语言(如 C#、Ruby 或 Java)中,名称 通常会成为与对象一起存储的元数据的一部分,而不是仅仅将每个引用替换为在内存地址。当您想要在运行时执行某些在 C 中几乎不可能的巧妙技巧时,该元数据会派上用场,例如询问“此集合中的哪些对象具有名为 foo 的字段?”。

    【讨论】:

    • 真正有趣的东西。谢谢!
    【解决方案2】:

    在编译代码时,编译器是否基本说:“Ok myInt 引用地址 0xffffff”,并在机器码中实质上替换为内存地址?

    如果myInt 在堆栈上,则堆栈指针的偏移量 被搁置一旁。编译器会记住 myInt 在编译该函数时存在。

    如果myInt 具有全局或文件范围,则在链接器可以决定绝对 位置之前,它仍然是myInt

    我仍然对内存地址本身的表示方式感到困惑......

    内存中的字节按升序编号。因此,绝对地址或堆栈偏移量在位级别上都看起来像 int

    【讨论】:

    • 好的,所以(可能是一个深奥的问题),每一位内存如何“知道”它的地址?我知道它们是按顺序编号的,但是这个字节编号存储在哪里?因此,如果内存中的特定字节的地址为 0xFFFFFF,则要存储该地址本身,就像指针那样需要 32 位,所以看起来像这个无限循环 - 每个字节都需要一个字节大小的地址才能知道它在哪里。
    • @DanielGraef:位(通常不可寻址,因此通常没有地址)和字节不知道自己的地址。编号隐含在内存芯片的地址解码逻辑以及地址线如何连接到 CPU 的地址总线中,并且可能会被 MMU 之类的东西再次修改。
    • @DanielGraef:没有。可以这么说,每一位都不知道它在哪里。由于这些字节是按顺序编号的,因此当 CPU 需要特定地址的数据时,它可以从数学上计算出该数据的位置。它不必从任何地方读取地址。
    • 啊,好的,非常感谢大家。我希望你能理解这对初学者来说有点混乱!
    • @DanielGraef:既然你是初学者,想象一下我向你要书架上的第 7 本书。 “第七本书”不会写在任何地方。第七本书不知道它是第七本书。但你会含蓄地(数学上?)知道该递给我哪本书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多