2017-06-06 63 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的數據結構中,該數據結構將每個標識符與關於其聲明和存儲器地址分配的信息相關聯。

在編譯過程中,爲標識符分配一個內存地址,然後使用分配給進程的內存堆棧的基址指針的偏移量來訪問內存地址。

相關問題