从X86向X64迁移的一点心得
X64平臺越來越普及,目前一些分析軟件多推出了X64版本,而我們的工具集項目同樣也有X64版本。我們基于同一套標準C++代碼實現(xiàn)了Windows和Linux的跨平臺,這幾天從X86平臺向X64平臺遷移的過程中,卻遇到了一點麻煩,也學到了一招:(以下內(nèi)容均限定在wintel+vc 10.0編譯器)
假如我有一個類ClassA
class ClassA {...public:int search(Filter, void**);... };ClassA的1個查詢方法(例如空間查詢)search接收一個查詢過濾器,返回void*數(shù)組,在search函數(shù)的實現(xiàn)中,采用下面語句:
malloc(sizeof(void*)*count);好,接下來考慮如下兩種調(diào)用情形:
long* r_lst1 = NULL; void* r_lst2 = NULL; int r1 = ClassAObj->search(flt, r_lst1); int r2 = ClassAObj->search(flt, r_lst2);顯然,不管什么平臺,條件相同的查詢得到的結果數(shù)量肯定是相同的,也就是有r1==r2;
且在32位平臺下,r_lst1與r_lst2將不會有任何區(qū)別;
但是在x64平臺下,r_lst1在外部顯式地聲明為long*類型,而long類型在32和64位下均占4個字節(jié),但是在函數(shù)實現(xiàn)中采用void*類型申請內(nèi)存,void*在32位下占4個字節(jié),而在64位平臺上占8個字節(jié),這樣在外部使用r_lst1[i]形式訪問r_lst1中的元素時,就會帶來錯誤。
反過來看第二次查詢操作,x64平臺下它在外部聲明的void*本身為8字節(jié)長度,因此不會帶來函數(shù)內(nèi)外數(shù)據(jù)類型字節(jié)長度不一致的問題。
因此在這樣的一些查詢操作中,與其將對象的標識符(通常為整數(shù))作為查詢的預期結果元素放入索引結構中,自行在外部處理跨平臺問題,不如直接將所操作的對象指針放入索引結構,這樣采用void*來進行操作,就避免了數(shù)據(jù)類型轉(zhuǎn)換帶來的字節(jié)長度不一致的問題,同時在內(nèi)存中操作數(shù)據(jù)也更加便捷,省去了查詢到標識符再去取對象數(shù)據(jù)的過程,可通過直接cast來獲得要操作的對象,缺點是查詢過程中對象占用內(nèi)存。
在GIS中需要跨平臺(特別是x86+x64)的空間查詢優(yōu)化過程中可考慮該技巧。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yeahgis/archive/2013/05/08/3067845.html
總結
以上是生活随笔為你收集整理的从X86向X64迁移的一点心得的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博客收集
- 下一篇: 【软件工程】UML软件