[百度空間] [原]跨平台編程注意事項(二): windows下 x86到x64的移植

來源:互聯網
上載者:User

標籤:

之前轉的:

將程式移植到64位Windows

還有自己亂寫的一篇:

跨平台編程注意事項(一)

 

之前對於x64平台的移植都是紙上談兵,算是前期準備工作, 但起碼在寫代碼時,已經非常注意了.所以現在移植起來相對很順利.昨天用了一天時間把自己代碼添加了x64支援.
貼一下遇到的問題,就作為注意事項吧,以下文字來自我的cnblogs部落格的另一文章,有修改

 

1.指標到數值的轉換. 

指標 (如void*)轉到數值,要用intptr_t或者uintptr_t (用Win32的INT_PTR也可以,當然用C/C++標準的更好),而不使用int/uint/DWORD, 因為x64平台下的void*或者任何指標都是64位的, 轉到DWORD(win x64的LLP64下的long,32位)就被截斷到32位了,如果再轉到64位的指標,就丟失了高雙字的部分.

這個問題在"跨平台編程注意事項(一)"提到過, 目前基本沒有遇到,因為之前的編碼已經很注意這個問題了.但是有兩行跟FreeImage相關的AlignedMalloc代碼,直接複製FreeIamge裡面的AlignedMalloc,他用的是void*-->unsigned long,當時直接Ctrl+V,沒仔細看,所以這裡程式就崩潰了.

2.記憶體邊界對齊的問題.

目前Win32下 VC10預設對齊到8位元組,x64對齊到16位元組.
因為之前的記憶體管理沒有考慮x64平台的記憶體對齊,所以會有一些問題.遇到的一個問題就是libPNG(FreeImage的依賴)中使用的setjmp(作為一個C++程式猿, setjmp/longjmp我從來不用的),執行到讀寫FPU狀態標記FNSTCW(一個WORD)和MMX指令就崩潰,提示記憶體讀0地址,但是看記憶體是好好的,調試了半天找不到原因,最後看了下建立的(我的記憶體管理給分配的)pngstruct沒有對齊到16位元組邊界,導致setjmp的參數沒有對齊.嘗試性的試了下,居然好了.懷疑是讀寫非對齊記憶體的問題,但記得x86下不對齊只會有效能損失,x64會出錯麼? 不太瞭解,有空了再多搜搜文檔,瞭解下.
目前解決方案是,記憶體管理模組會根據目標平台,選擇對應的對齊大小.

3.Win32下的各種API.

一些MFC的三方庫沒有用DWORD_PTR和INT_PTR作為參數.其他主要是GetWindowLongPtr這類,看msdn上說要用這個保持x86/x64相容,這個早已經用了,但沒發現對應的宏,GWL_XXX的對應要用GWLP_XXX的版本,這個一開始也是覺得詭異,怎麼x64下沒有這個宏了,不知道有什麼問題,後面google了一下就出來了,相對比較簡單.

4.內聯彙編.

在MSVC的x64編譯器不支援內聯彙編了(以後可能會支援?),這個以前不知道,還傻乎乎寫了64位的內聯彙編,後來在貼吧知道了,就把預先寫的64位內聯彙編刪除了...其實也沒怎麼用內聯彙編,主要就是同步鎖用了lock cmpxchg,以及原子操作用了lock xadd等等,解決方案也很簡單,去掉所有內聯彙編,用MSVC的intrins: _InterlockedCompareExchange / _InterlockedCompareExchange64 一族和GCC的built-in: __sync_fetch_and_add / __sync_add_and_fetch / __sync_bool_compare_and_swap一族.

[百度空間] [原]跨平台編程注意事項(二): windows下 x86到x64的移植

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.