2013-11-26 52 views
2

Oracle website上,它表示bools在堆棧中佔用32位,而在數組中佔8位。我很難理解爲什麼他們在一個小組中比在單身時少。它們是如何存儲的,它們有什麼不同?如果布爾數組更有效率,爲什麼這項技術不會轉移到單身?爲什麼bools在陣列中佔用較少的內存?

另外,爲什麼不1位?

64位系統和32位系統如何存儲這些數據有什麼區別?

謝謝!

+0

與問題無關,但請閱讀以下內容:http://meta.stackexchange.com/questions/27162/ethics-of-editing-out-gratitude – alfasin

+0

感謝您的鏈接,@alfasin以及感謝您關注以下問題規則...我把我的感激回饋,因爲我真的很感謝這個真棒網站,我感覺像是一個'謝謝!'真的不會妨礙任何理解。它有點說:「我是一個真正的人,我很感激你支付我的一些注意!」 –

回答

3

看起來,當談到堆棧時,必須記住速度是最重要的。例如,考慮以下因素:

void method(int foo, boolean bar, String name) .... 

然後堆棧剛過進入方法是這樣的:

|-other variables-|-...-|-name-|-bar-|-foo-|---- return address etc. -- 
^ 
stack pointer 

這些都是一個字邊界上的所有數量,由|象徵。當然,JVM可以(理論上,但見下文)將布爾值存儲在單個字節中。但是我們必須記住,32位負載在不處理字邊界時可能會變慢。根據體系結構,可能不可能通過一個不在字邊界上的指針。或者可能無法在浮點指令中使用數量等。

另外,字節碼格式只能尋址堆棧中第012個字。如果不是這樣,相對於堆棧指針的地址必須以字節指定,這意味着幾乎任何堆棧訪問都會有兩個大部分時間無關的位,因爲大多數參數都是字(int ,浮點或引用)或雙字(長,雙)。

從來沒有可能的是使用1位布爾值。爲什麼?因爲位不能直接尋址。最小的可尋址單元是字節。

如果您覺得應該節省內存,則仍然可以在int中存儲32個布爾值。

3

由於CPU工作的方式,所有的操作都以32位完成。如果你有一個單一的bool,編譯器可以做的唯一現實的事情是將其餘的24位清零並保存到堆棧中,因爲掃描你的java文件以供其他bools使用並將它們全部存儲在相同的32位內存塊。

如果你有一個布爾數組,只需要以4個塊爲單位來引用它們是很簡單的,所以它只有8個布爾值。

請注意,這僅適用於32位應用程序/機器。

+1

我的後續問題是,爲什麼不使用1位bool並將它們存儲在32個塊中?那會更有效率,不是嗎? – CompuChip

+1

好吧,對此的回答是,jvm並不是爲支持1位操作而構建的,所以「bool」只是一個以另一個名字命名的字節。使用1位保存的內存量非常小,不值得增加計算複雜度。 –

+1

如果他們將bools存儲到一個位中,可能會涉及更多的開銷,因爲今天的CPU並不是爲了獲取單個內存而設計的。 – Josh

7

一個布爾值可以存儲爲一個二進制數字,但我們的計算機組值爲方便。實際處理的最小單位是一個字節,其次是一個字。在現代硬件中,一個字節總是8位。 32位已經成爲一個詞的標準。即使我們的64位計算機也能有效處理32位字。將bool存儲在任何自然單元中比單獨存儲要方便得多。在一個數組中,自然單位將是一個字節,因爲您可以處理內存中的任何字節。在字堆棧中,自然單元是一個字。你可以將bools填入字節和單詞中,並逐字逐句地將它們一點一點地拉出來,但這比將它們存儲在字節或單詞中效率不高,因爲現代存儲器很大,所以CPU速度更受關注。你不想浪費所有的時間來緊湊地打包比特,所以我們浪費了內存,因爲它更加易耗。

+0

這就是我正在尋找的。還有一件事...... 64位機器有沒有不同的存儲方式? –

+0

我們的64位x64體系結構基於較舊的32位x86體系結構,並且在不需要64位時通常處理32位。給我一點時間來看看x64以確定調用堆棧是否總是64位,我會馬上回到你身邊。 –

+0

在x64架構中,堆棧將始終爲64位。當一個64位CPU運行一個32位程序時,它將64位字段中的所有32位值存儲在堆棧中,因此浪費了一半的存儲空間。 bool將作爲64位字存儲在x64計算機的堆棧中。 –