gpt4 book ai didi

c# - 变量如何寻址RAM?

转载 作者:行者123 更新时间:2023-11-30 18:51:49 26 4
gpt4 key购买 nike

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

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

int x;

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

最佳答案

If I have the statement int x; I would assume this is taking up 4 bytes of memory. How does x map to the address of the four bytes?

首先,Mike 是正确的。 C# 经过专门设计,因此您无需担心这些问题。让内存管理器为您处理;它做得很好。

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

局部变量(*)不占用内存有两种方式。首先是它从未被使用过:

void M()
{
int x;
}

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

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

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

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

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

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

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

(**) 如果不安全的代码取了本地的地址,显然是不能注册的。

关于c# - 变量如何寻址RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8779754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com