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