一開始是發現只要是含有虛擬指標的物件使用到了inline function時,
都有可能少算8bytes/64bits的位移,為什麼呢?
唉,這樣我的計算程式又qq了,

舉例來說:
vtk有個vtkIdList, sizeof(vtkIdList) = 56
可以儲存一個整數集合,vtkIdList 有三個成員,
定義 typedef int vtkIdType; , sizeof(int) = 4
vtkIdType NumberOfIds;
vtkIdType Size;
vtkIdType *Ids;
這個class繼承自 vtkObject , sizeof(vtkObject) = 40

這個 class 在執行到這個inline function時會出錯,
vtkIdType GetId(const vtkIdType i) {return this->Ids[i];};
mov         dword ptr [rsp+10h],edx
mov         qword ptr [rsp+8],rcx
push        rdi  
movsxd      rcx,dword ptr [i]
mov         rax,qword ptr [this]
mov         rax,qword ptr [rax+30h]
mov         eax,dword ptr [rax+rcx*4]
pop         rdi  
ret   
30h應該是對的,我們來算一算他的大小,
*Ids 64位元指標佔8bytes
56-8 = 48 = 30h 照理來說沒錯呀!
可是經過debug後取到的不是*Ids而是Size,
且Size大8bytes,NumberOfIds也是8bytes,
代表這個sizeof(vtkIdList) = 64 才對
sizeof(int) = 8
sizeof(long) = 4
怪了,真是bug,
還有一個怪的地方,我在debug介面顯示的指標位址是對的,
可是執行程式卻是錯的......
結果是我引用的標頭檔是32位元用的...

讓地獄深紅的天亮 發表在 痞客邦 PIXNET 留言(0) 人氣()