C 的可移植性和跨平台開發 4 硬體體系相關

2021-06-08 23:32:15 字數 932 閱讀 9137

這次聊的話題主要是和硬體體系有關的。比如你的程式需要支援不同型別的cpu(x86、sparc、powerpc),或者是同種型別不同字長的cpu(比如x86和x86-64),這時候你就需要關心一下硬體體系的問題。

★基本型別的大小

c++中基本型別的大小(占用的位元組數)會隨著cpu字長的變化而變化。所以,假如你要表示乙個int占用的位元組數,千萬不要直接寫「4」(順便說一下,直接寫「4」還犯了magic number的大忌,詳見這裡),而應該寫「sizeof(int)」;反過來,如果你要定義乙個大小必須為4位元組的有符號整數,也不要直接用int,要用預先typedef好的定長型別(比如boost庫的int32_t、ace庫的ace_int32、等)。

差點忘了,指標的大小也有上述的問題,也要小心。

★位元組序

如果你沒聽說過「位元組序」這玩意兒,請看「維基百科」。通俗地打個比方,在乙個大尾序的機器上有乙個4位元組的整數0x01020304,通過網路或者檔案傳到一台小尾序的機器上就會變成0x04030201;據說還有一種中尾序的機器(不過我沒接觸過),上述整數會變成0x02010403。

★記憶體對齊

如果你不曉得「記憶體對齊」是什麼東東,請看「維基百科」。簡單來說,出於cpu處理上的效能考慮,結構體中的資料不是緊挨著的,而是要空開一些間隔。這樣的話,結構體中每個資料的位址正好都是某個字長的整數倍。

由於c++標準中沒有定義記憶體對齊的細節,因此,你的**也不能依賴對齊的細節。凡是計算結構體大小的地方,都老老實實寫上sizeof()。

有些編譯器支援#pragma pack預處理語句(可以用來修改對齊字長),不過這種語法不是所有編譯器都支援,要慎用。

★移位操作

對於有符號整數的右移操作,有些系統預設使用算數右移(最高的符號位不變),有些預設使用邏輯右移(最高的符號位補0)。所以,不要對有符號整數進行右移操作。順便說一下,即使沒有移植性問題,**中也盡量不要使用移位運算操作,可讀性太差。

C 的可移植性和跨平台開發 4 硬體體系相關

這次聊的話題主要是和硬體體系有關的。比如你的程式需要支援不同型別的cpu x86 sparc powerpc 或者是同種型別不同字長的cpu 比如x86和x86 64 這時候你就需要關心一下硬體體系的問題。基本型別的大小 c 中基本型別的大小 占用的位元組數 會隨著cpu字長的變化而變化。所以,假如...

C 的可移植性和跨平台開發 0 概述

今天聊聊c 的可移植性問題。如果你平時使用c 進行開發,並且你對c 的可移植性問題不是非常清楚,那麼我建議你看看這個系列。即使你目前沒有跨平台開發的需要,了解可移植性方面的知識對你還是很有幫助的。c 的可移植性這個話題很大,包括了編譯器 作業系統 硬體體系等很多方面,每乙個方面都有很多內容。鑑於本人...

C 的可移植性和跨平台開發 2 語法

目前還有相當一部分開發人員在使用老式編譯器幹活,這些老式編譯器可能對c 98支援不夠。因此,當你的 移植到這些老式的編譯器上時,可能會碰到一些稀奇古怪的問題 包括編譯出錯和執行時錯誤 下面這些注意事項有助於你繞過這些問題。強調一下,後面提到的好幾個條款都是通過迴避c 的新語法來保證移植性。如果你用的...