【问题标题】:How variables address RAM?变量如何寻址 RAM?
【发布时间】:2012-01-08 16:40:02
【问题描述】:

我对此很陌生,所以如果这个问题没有意义,我提前道歉。

如果我是正确的,c# 中的 int 是 4 个字节。如果我有声明:

int x;

我假设这会占用 4 个字节的内存。如果每个内存地址空间是 1 个字节,那么这会占用四个地址槽吗?如果是,x 是如何映射到四个地址位置的?

【问题讨论】:

  • 嗯,这是个好问题,但答案很长。我会看看我能保持多短。
  • 我同意,我认为这对 SO 会更好。

标签: c# computer-science


【解决方案1】:

如果我有声明 int x; 我会假设这占用了 4 个字节的内存。 x如何映射到四个字节的地址?

首先,迈克是对的。 C# 是专门设计的,因此您无需担心这些东西。让内存管理器为您处理;它做得很好。

假设您确实想看看香肠是如何制作的以启发您自己:您的假设没有根据。此陈述不需要导致任何 要消耗的内存。如果确实会导致内存被消耗,则 int 会消耗 4 个字节的内存。

有两种方法可以使局部变量 (*) 不消耗内存。首先是它从未使用过:

void M()
{
    int x;
}

编译器可以足够聪明地知道 x 永远不会被写入或读取,并且可以合法地完全省略。显然它不会占用任何内存。

第二种不占用内存的方法是,如果抖动选择注册本地。它可以专门为该局部变量分配一个机器寄存器。然后该变量没有与之关联的地址,因为显然寄存器没有地址。 (**)

假设本地确实占用了内存,则抖动负责跟踪该内存的位置。

如果本地是一个完全正常的本地,那么抖动会将堆栈指针增加四个字节,从而在堆栈上保留四个字节。然后它将这四个字节与本地相关联。

如果本地是匿名函数的封闭外部本地、迭代器块的本地或异步方法的本地,则 C# 编译器将生成本地作为类的字段;抖动要求垃圾收集器分配类实例,并且抖动将本地与垃圾收集器与该实例关联的内存缓冲区开头的特定偏移量相关联。

所有这些都是实施细节,可能随时更改;不要依赖它。

(*) 我们知道它是一个局部变量,因为您说它是一个语句。字段声明不是语句

(**) 如果不安全代码采用本地地址,显然无法注册。

【讨论】:

    【解决方案2】:

    关于这一点可以说很多(我的意思是很多)。您正在讨论的各种主题包括stacksymbol tablememory managementmemory hierarchy……我可以继续。

    但是,既然你是新人,我会尽量给出一个更简单的答案:

    当您在程序中创建变量(例如 int)时,您是在告诉编译器在内存中为该数据保留一个空间。一个 int 为 4 个字节,因此保留了 4 个 连续 个字节。您所指的内存位置仅指向开头。后来知道长度是4个字节。

    现在内存位置(在您提供的情况下)并没有真正以与变量相同的方式保存。每次有需要x 的命令时,该命令都会被替换为显式获取该内存位置的命令。换句话说,地址保存在程序的“代码”部分,而不是“数据”部分。

    这只是一个真的真的高度概述。希望对您有所帮助。

    【讨论】:

    • 而如果是局部变量,很有可能会留在寄存器中而不是被溢出到堆栈中。
    • @SK-logic,哦,好点。也忘了考虑这个因素。
    【解决方案3】:

    您真的不需要担心这些事情,因为在 C# 中您无法编写可以利用这些信息的代码。

    但是如果你必须知道,在机器代码级别,当我们指示 CPU 访问 x 的内容时,将使用这四个字节中的第一个字节的地址来引用它。执行此操作的机器指令还将包含有关要访问多少字节的信息,在本例中为四个。

    【讨论】:

      【解决方案4】:

      如果 int x;如果在函数中声明,那么变量将被分配在堆栈上,而不是堆或全局内存中。 x 在编译器符号表中的地址将引用四字节整数的第一个字节。但是,由于它在堆栈上,因此记住的地址将是堆栈上的偏移量,而不是物理地址。然后将通过使用当前堆栈指针的偏移量的指令来引用该变量。

      假设 32 位运行时,堆栈上的偏移量将对齐,因此地址是 4 字节的倍数,即偏移量将以 0、4、8 或 0x0c 结尾。

      此外,因为 80x86 系列是little-endian,所以整数的第一个字节是最低有效字节,第四个字节是最高有效字节,例如十进制值 1,000,000 将存储为四个字节 0x40 0x42 0x0f 0x00。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多