首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 跨平台開發實戰 (四):硬體架構相關差異與應對

     編輯:關於C++

基本型別大小隨 CPU 字長變化

型別32-bit (x86)64-bit (x86-64)應對
int44用 sizeof(int) 而非寫死 4
long44/8 (LP64/LLP64)避免直接用 long,改用定長型別
void*48用 sizeof(void*) 或 uintptr_t
size_t48標準庫保證足夠大

定長型別:int32_t, int64_t, intptr_t (C99 <stdint.h> / C++11 <cstdint>),或 Boost/ACE 對應型別。

位元組序 (Endianness)

  • 小端序 (Little-endian):x86, x86-64, ARM (預設)。0x01020304 記憶體序 04 03 02 01。
  • 大端序 (Big-endian):PowerPC, SPARC, 網路序。01 02 03 04。
  • 中端序:極少見 (如某些 ARM 模式)。

網路/檔案傳輸鐵律:


// 主機序 ↔ 網路序 (大端)
uint32_t htonl(uint32_t host);  // host to network long
uint32_t ntohl(uint32_t net);   // network to host long
uint16_t htons(uint16_t host);
uint16_t ntohs(uint16_t net);

二進制檔案格式明確定義位元組序 (通常採網路序),讀寫時轉換。

記憶體對齊

  • CPU 存取對齊位址效能最佳,結構體自動填補 padding。
  • C++ 標準未規定對齊細節,不可依賴 offsetof、結構體大小等具體值。
  • 統一用 sizeof(T) 計算大小,alignof(T) (C++11) 查詢對齊需求。
  • #pragma pack(n) 非標準,僅在特定編譯器支援下謹慎使用。

有號整數右移行為未定義

  • 算術右移 (保留符號位) vs 邏輯右移 (補 0) 由實作定義。
  • 禁止對有號整數右移。需位元操作時,轉換為無號型別 (uint32_t) 再操作。
  • 一般程式碼避免位移運算,可讀性差且易錯;改用乘除或標準庫函式。

總結檢查清單

  • [ ] 所有「寫死 4/8」替換為 sizeof 或定長型別?
  • [ ] 指標轉整數用 uintptr_t/intptr_t?
  • [ ] 網路/檔案雙向傳輸是否完整 hton/ntoh 轉換?
  • [ ] 結構體大小計算是否用 sizeof?
  • [ ] 是否有對有號整數右移的代碼?
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved