一開始是發現只要是含有虛擬指標的物件使用到了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位元用的...
公告版位
星落的瞬間!放棄的後悔是永遠!
- Aug 18 Thu 2011 03:09
vc2008 的 c++ x64 runtime error
全站熱搜
留言列表
發表留言