64位C 程式設計課堂

2021-07-03 01:22:23 字數 1816 閱讀 7667

本系列為的學習總結

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...