2013-03-09 92 views
2

如果我有一個變量int d; // some comment。 這會比int daysElapsedSinceBlahBlahBlahBlah好,沒有任何評論。 這是更加reabale,但它會浪費記憶?長變量名是否浪費內存?

+3

這可能會引起討論。這不是關於你面對的具體編程問題,或者如何解決它。在我看來,這不太適合。此外,它高度依賴於上下文。 – 2013-03-09 21:43:30

+3

@BenjaminGruenbaum編程問題(至少是假設的)已清楚陳述。上下文相關性應該是答案的一部分 – SomeWittyUsername 2013-03-09 21:53:24

+0

@icepack這是一個偏好問題,這個問題是開放性的。 – 2013-03-09 21:54:13

回答

4

這完全取決於語言及其實現,但我可以給你一些基於我知道的幾種語言的例子。

在C和C++中,變量名稱是程序員和編譯器的符號標識符。編譯器用內存地址,CPU寄存器替換它們,或者用內聯函數替換它們的訪問,以完全消除它們。這些名稱不會出現在生成的代碼中。它們可以出現在生成的調試信息中,但是當不需要再進行交互式步驟調試時,可以省略該程序的發佈版本。

在Java中,編譯器消除函數本地變量名稱並重寫代碼以使用堆棧相對偏移量。字段名稱(即類級別的變量)在編譯的字節碼中保留。這主要是因爲類是單獨編譯的方式,並且可以在運行時動態鏈接,所以編譯器無法一次優化整個程序的狀態。字段名稱保存的另一個原因是因爲它們可通過reflection獲得。在運行時,虛擬機可以生成本地代碼,其主要僅使用內存地址和本地CPU寄存器,其方式爲C++。不管怎樣,字段名都保存在內存中,用於反射,並且可以鏈接任何其他加載的類。中期全程序優化器&像ProGuard這樣的混淆器可以使所有的符號名稱儘可能短。

在諸如JavaScript和PHP之類的具有eval函數的語言中,即使局部變量名也必須保持在理論上,因爲它們都可以通過運行時字符串按名稱訪問。一個好的解釋器可以優化它以在使用快速內存​​地址的情況下可以證明特定變量不是按名稱訪問的。

在真正的逐行解釋程序中,像很老的BASIC實現一樣,必須始終保持變量名,因爲解釋程序直接從源代碼運行。當它移動到下一行時,它會忘記每一行,因此除了在源代碼中使用它們的名稱之外,它無法跟蹤變量。由於完整的源代碼必須在運行時保存在內存中,並且通常限制在64 kB或更少,所以變量名稱確實很重要!這個時代的代碼經常使用(和重複使用)加密的短名稱,因爲這個原因(也出於其他原因,比如BASIC代碼有時被打印在需要輸入的雜誌中,而這些平臺沒有特別好的鍵盤或編輯。)

除非您爲80年代或更早版本的翻譯編程,否則無論如何標識符名稱都很便宜,您不必擔心。選擇足夠長的可以理解的名稱,並且足夠短以便快速閱讀。讓編譯器擔心其餘部分,或者在編寫代碼後運行優化程序或代碼minifier

7

您將此標記爲language-agnostic,但該示例對應於C語言系列。在C語言中,變量的名字不應該浪費內存,它只是編譯器的標籤。在生成的二進制代碼中,它將被內存地址替換。

一般來說,在生成的二進制文件中存儲變量的名稱沒有任何好處,我能想到的唯一用法是一些極端的調試,反向工程或某種奇怪的反射形式。這些都不是正常的使用情況。

6

變量名稱從不佔用內存。至少還不足以甚至開始擔心它。儘管某些語言實現將變量名稱存儲在某個地方(有時語言甚至需要這樣做),但與其他所有環境相比,它們佔用的空間相當小。只要使用其他指標(可讀性,慣例等)最好的方法。