2013-11-29 40 views
2

顯然,編譯器必須存儲變量x是無符號整數還是有符號整數,浮點或其他什麼,但是在哪裏以及如何存儲信息?編譯器如何在內存中存儲關於變量類型的信息?

是否有某種查詢表?我在內存中的哪個位置可以找到它,可執行文件的哪一部分?

+6

它被稱爲符號表。 http://stackoverflow.com/questions/69112/what-is-a-symbol-table – erbdex

+4

是的,輸出對象文件(.o,.obj)中包含一個符號表,用於存儲每個類型和名稱變量以及返回類型,調用約定,參數等...用於翻譯單元中的每個函數(通常爲.c或.cpp文件)。但是,在鏈接並生成可執行文件後,此信息可能會丟失**,在這種情況下,您需要調試符號表。但是你不會在內存中找到它,通常調試符號存儲在一個單獨的文件中並由調試器單獨使用;他們不需要你的程序運行。 –

+0

你只是好奇編譯過程如何工作,或者在這個問題下面有更大的問題嗎?如果你*神奇*擁有這些信息,你會在你的程序中使用它嗎?怎麼樣? – chwarr

回答

4

隱含的,在編譯器選擇的指令中。

舉例來說,如果地址18包含一個float,編譯器可使用指令,從地址18加載一個浮點寄存器而如果它的鄰居在地址20包含在int,編譯器可以加載從整數寄存器前面的地址+ 2.

如前所述,編譯器有一個符號表,因此它知道所有變量的位置。這使它可以選擇正確的說明。但是你不能簡單地從單個指令中得出符號表的內容。

2

除非啓用調試信息,否則C和C++實現通常不會在任何地方存儲變量名稱。正常執行時不需要變量名稱,但共享對象或DLL的導出符號除外。

+0

但是如果你進行算術運算,那麼CPU必須知道它是無符號整數還是帶符號整數。 – defoe

+1

@defoe:對於有符號/無符號類型,某些算術指令(如加法或乘法)在位級別相同。對於那些簽名很重要的人來說,有單獨的說明。 –

+2

@defoe CPU不需要「知道」,因爲編譯器已經爲每種情況發出了正確的指令。 CPU不做任何類型分析。 – molbdnilo

相關問題