2017-06-06 65 views
-1

分配给变量(例如int i = 5)的任何值以十六进制形式存储在内存中的某个地址处。 那么与存储相关的变量名称(i)会在内存中转换为ASCII码吗?标识如何存储在内存中?

+4

不确定您是在询问Java还是C,但在这两种情况下答案都是_no_。 –

+2

“* ...采用十六进制形式... *”编号值使用位以二进制形式存储。所有数据都使用位进行存储,这只是二进制的物理实现。十六进制对程序员来说只是一个方便的数字系统。 – Cornstalks

+0

[当你说'int i = 5;'](https://godbolt.org/g/VxKtUu)时,你的电脑实际上正在做这件事。它分配一小块内存并为其分配值5。从人类可读代码(本例中为C)转换为机器可读代码(本例中为x86_64)时,该变量的名称完全丢失。有些语言支持[反思](https://en.wikipedia.org/wiki/Reflection_(computer_programming)),所以(取决于语言)可能会在运行时提供有关特定变量的某些信息。但C不支持反射。 – Cornstalks

回答

0

我不能对Java说话的内存只是一个普通的分配。

在C中,可变标识符(通常)不保留在所生成的机器代码。相反,你会(通常)看到通过寄存器的偏移量引用的对象。

例如,在我的系统,给定的源极线

i = 5; 

我的编译器生成的机器代码

movl $5, -4(%rbp) 

%rbp基指针寄存器 - 它存储的基地址一个堆栈帧,它包含函数参数(如果有的话),局部变量(如果有的话)的空间和下一个指令的地址函数调用。在我的系统中,局部变量存储在基指针寄存器(负偏移)中的值“下方”,而函数参数存储在“上”(正偏移)处。与函数参数或变量关联的标识符根本不被保留。

0

是的,Java存储的东西。

答:

运行时知道输入的一切是因为几乎所有的东西都是一个对象,每个对象有一个名为“的getClass()”方法,这将返回对象的类型。

,当一个对象被传递到Java中的方法的装置,所述参数类型是已知的,并且还对象的类型是太已知的。这意味着要确定它是否是一种有效的类型是很容易的。

INT在Java不是一个对象,但该类型的信息在两个仍然存在的方法int参数,并很容易检查它们是否匹配。

一个4字节串与32位整数的例子是在C语言的有效足够点,但不是在Java中,其中字符串是由被简单地给定长度的字符数组抽象出来。字符串是在Java对象,而不是像C.

+0

但是Java不存储(本地非成员)变量本身的名称。 – Cornstalks

+1

@Cornstalks它的确如此,但并不符合您的期望。类文件*可以包含一个LocalVariableTable(但不是运行所必需的,可以省略),它描述了哪个索引(内存地址的排序)具有哪个变量名称和类型(因为索引可以在一种方法中用于不同的局部变量)https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.13 –

1

标识符名称不保留在编译后的汇编文件。它们在编译期间保持在称为Symbol Table的数据结构中,该数据结构将每个标识符与关于其声明和存储器地址分配的信息相关联。

在编译过程中,为标识符分配一个内存地址,然后使用分配给进程的内存堆栈的基址指针的偏移量来访问内存地址。