簡體   English   中英

Java中的原始數據類型和可移植性

[英]Primitive data types and portability in Java

我引用Herbert Schildt的第3章數據類型,變量和數組:

基元類型表示單個值而不是復雜對象。 雖然Java完全是面向對象的,但原始類型卻不是。 這種效率的原因。 制作原始類型會使性能降低太多。

原始類型被定義為具有明確的范圍和數學行為。 諸如C,C ++之類的語言允許整數的大小根據執行環境的指示而變化。 但是,Java是不同的。 由於Java的可移植性要求,所有數據類型都具有強烈定義的范圍。 例如,無論特定平台如何,int總是32位。 這允許編寫保證在不移植任何機器架構的情況下運行的程序。 雖然嚴格指定整數的大小可能會導致某些環境中的性能損失很小,但為了實現可移植性,這是必要的。

他最后兩行是什么意思? 如何指定整數的大小可能會導致某些環境中的性能損失很小?

在“較低”語言中,原始數據類型大小通常來自CPU處理它們的能力。 例如,在int被定義為“大小至少為16位”,但其大小可能因架構而異,以確保“int類型應該是目標處理器最有效的整數類型”。 “。 來源 )。 這意味着如果你的代碼對int的大小做了粗心的假設,那么如果你將它從32位移植到64位 ,它可能會破壞。

如上所述, 是不同的。 例如, int將始終為32位。 這意味着當您在不同的體系結構上運行相同的代碼時,您不必擔心其大小更改。 如上所述,權衡是性能 - 在任何本身不處理32位計算的架構上,這些int需要擴展到CPU可以處理的本機大小(這會有一個小的懲罰),或者更糟如果CPU只能處理小int S,上的每一個操作int可能需要幾個CPU操作。

一些(很少) 計算機使用36位架構 ,因此您需要額外的步驟來屏蔽位,模擬溢出等。

AFAIK,java中沒有辦法定義整數的大小。 它總是一個32位int,如這里提到的 但是一些編程語言可能允許指定整數的大小(例如:Ada)。

編譯器嘗試將代碼轉換為machine code instructions時出現性能問題(請參見此處此處 )。 通常機器代碼指令是32位或64位。 如果我們的int與機器代碼中的大小相同,則很容易將它們轉換為機器代碼。 否則編譯器需要付出額外的努力將它們轉換為機器代碼。 那是性能問題出現的時候。

Java在底層系統的指針機制的頂部實現了自己的數據指針機制。 如果數據不夠大,許多系統可能會使用較小的指針。

例如:如果整數數據只需要16位指針,系統將只分配使用16位指針所需的存儲空間。 但是,如果您使用的是Java,它會將16位轉換為32位指針分配,這需要大的內存空間,這也會降低存儲數據搜索方面的性能。 因為你的指針很大

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM