分配给变量的任何值(例如int i = 5)在某个地址以十六进制形式存储在存储器中。 那么与值相关联的变量名称(i)是否会在存储时转换为内存中的ASCII代码?
答案 0 :(得分:1)
编译后,标识符名称不会保留在汇编文件中。它们在编译期间在称为Symbol Table的数据结构中进行维护,该数据结构将每个标识符与其声明和内存地址分配的信息相关联。
在编译期间,为标识符分配一个存储器地址,然后使用从分配给该进程的存储器堆栈的基指针的偏移量来访问该地址。
答案 1 :(得分:0)
是的,Java存储了这些东西。
<强>答案:强>
运行时知道什么类型的东西,因为几乎所有东西都是一个对象,每个对象都有一个名为“getClass()”的方法,它将返回对象的类型。
这意味着当一个对象传递给Java中的方法时,参数类型是已知的,并且对象的类型也是已知的。这意味着如果它是一种有效的类型,那么很容易解决。
Java中的int不是一个对象,但类型信息仍然存在于方法中的两个int参数中,并且很容易检查它们是否匹配。
4字节字符串与32位整数的示例在C中是足够有效的点,但在Java中则不然,其中字符串被抽象而不是简单的给定长度的字符数组。字符串是Java中的对象,而不仅仅是C中的简单内存分配。
答案 2 :(得分:0)
我不能说Java。
在C中,变量标识符(通常)不会保留在生成的机器代码中。相反,您(通常)会看到通过寄存器偏移引用的对象。
例如,在我的系统上,给定源代码行
i = 5;
我的编译器生成机器代码
movl $5, -4(%rbp)
%rbp
是基指针寄存器 - 它存储堆栈帧的基地址,其中包含函数参数的空间(如果有的话),本地变量(如果有),以及函数调用后的下一条指令的地址。在我的系统中,局部变量存储在基本指针寄存器中的值“下方”(负偏移),而函数参数存储在“它上面”(正偏移)。与函数参数或变量关联的标识符根本不会保留。