本系列為的學習總結
lessons 1. what64-bit system are
目前有2種最流行的64位處理器架構:ia64和intel 64。ia64即通常所說的安騰,主要用於sun的伺服器上;而intel64則是與x86相容的,本文主要討論這種。
x86-64有以下優點
l 64位定址空間,意味著最高內容不再限制到4g。不同版本的windows定址能力都有一定限制,最高為1tb
l 擴充套件的暫存器,64位的暫存器能允許更多操作(例如,程式中最多只能有4個硬中斷也是因為暫存器只有32位而限制的)
l 指令集與原來的相似
l 相容32位程式
l 相容32位系統
wow64 —— windows-on-windows 64,不是魔獸世界。因為64位的windows程式也要支援32位,wow64是乙個可以把32位的指令轉換為64位的一種模式,或者是一種子系統。(模擬32位機上執行16位程式,其實上就是存在乙個16位子系統)
從上面我們看到,32位程式在64位上通過wow64來執行。wow本身是乙個軟模擬,它會損失大約2%的效能!如果確實不能編譯為64位,有的編譯器提供支援3gb以上記憶體分配,這一優勢在64位上得以延續,它能夠訪問4g以上的記憶體(可能要鏈結特別的庫)。
dllhell
這一古老問題一起延續至今!以至於為了讓32位程式在64位上不要呼叫64位的系統dll,64位的wow把%systemroot%\windows目錄重定向到%systemroot%\syswow64下,也就是說,在syswow64目錄下是為32位程式準備的系統dll。目前,windows在逐漸放棄32位的支援。(ps:64位系統已經不支援16位程式)
lesson 3. portingcode to 64-bit systems. the pros and cons
儘管64位非常有吸引力,但是有沒有必要讓程式支援64位呢?如果是維護此前的32位程式,公升級的操作就有待商榷;另外,如果有用到第3方庫,也需要考慮其是否支援64位。
如果是新開發一款軟體,那就有必要考慮64位問題,即使它不準備以64位發布。作為乙個開發者,對未來的**意識是必要的,因為你無法肯定那天你的**就要以64位發布了。
lesson 4. creatingthe 64-bit configuration
你需要乙個支援輸出64位的編譯器,最好開發機也是64位的。
要想讓**在32位與64位自由編譯通過,首要是解決size_t和ptrdiff_t帶來的編譯警告!
size_t用來儲存陣列的理論最大長度,ptrdiff_t(intptr_t)用於索引陣列或儲存乙個指標的值。size_t常常**於c庫函式,比如strlen等;而ptrdiff_t主要來自for迴圈,並且它位常常是相互影響的(因為在32位程式下,很多人將陣列的大小和遍歷都是是用int來代替,事實上它們都是不標準的)。只有改變程式設計習慣,才能消除它們。
lesson 6. errors in 64-bit code
64位程式如果通過編譯器警告來找出bug,這還算是比較幸運的了,然而更多的問題是編譯器發現不了的。通常有以下幾種情況:
l 在計算指標大小時的錯誤(慣性思維會認為是4!)
l 訪問超過2g以上的陣列(慣用的int會變為負數!)
l 讀寫函式的返回值(如果不小心用int儲存,有可能溢位)
l 位操作符(這通常發生size_t等變化長度的型別上)
l 複雜的指標運算(指標最好不要直接與整數計算)
還有更多的情況,但最大的差異說到底還是來自於指標長度,這種bug隱藏得非常深;至於溢位,它發生的條件是原來的**也存在溢位的風險!對於經歷過嚴格測試的**來說,這種概率比較小。最後,給出一張c++在64位與32位標準型別的對比圖。
更快 更強 64位程式設計
15 與大眾看法相反的是,64位處理器對加密程式來說,並不會有太大的幫助。據 secrets and lies 作者 安全專家bruce schneier說法,現今的加密手段已經足夠快了,如果只是從兩毫秒減少到一毫秒,有什麼意義嗎?64位處理器不會對大多數的加密手段帶來乙個質的改變。17 可以只使用...
Windows上64位程式設計
windows上64位程式設計 2011年6月21日 18 01 c c 僅僅定義了這些基本資料型別之間的關係,並沒有定義嚴格定義它們的字長。在不同的平台上,根據編譯器不同的實現,它們的字長如下表所示 資料型別 lp64 ilp64 llp64 ilp32 lp32 char short 16 16...
C語言32位和64位程式設計注意事項
1.ilp32和lp64資料模型 32位環境涉及 ilp32 資料模型,是因為c資料型別為32位的int long 指標。而64位環境使用不同的資料模型,此時的long和指標已為64位,故稱作 lp64 資料模型。data type data length 32bit data length 64b...