好久沒來了,準備畢業、畢業答辯、畢業、找工作、現在終于穩定下來。突然想到一個問題,隨便測試下寫寫,不要拍磚哈
編譯器:VC2005 Release模式,代碼不優化
調試器: OllyDBG 1.10
程序如下:
class A


{
public:
A();
~A();
int a;
long b;
};
class B


{
public:
B();
~B();
int a;
long b;
};
A::A() : a(0)
,b(-1)


{
}
A::~A()


{
}
B::B()


{
a = 1;
b = -2;
}
B::~B()


{
}
int main()


{
__asm

{
push eax //加些標記,方便辨認
add esp,4
}
A a;
__asm

{
push ebx //加些標記,方便辨認
push ebx
add esp,8
}
B b;
return 0;
}
對應的匯編及分析如下:
對應的匯編及分析如下:
對應的匯編及分析如下:
//類A的構造函數
00401000 /$ 55 push ebp //將當前?;穳簵14?/span>
00401001 |. 8BEC mov ebp, esp //將當前棧指針作為棧基址
00401003 |. 51 push ecx //this指針壓棧
00401004 |. 894D FC mov dword ptr [ebp-4], ecx //保存this指針
00401007 |. 8B45 FC mov eax, dword ptr [ebp-4] //this指針放入eax
0040100A |. C700 00000000 mov dword ptr [eax], 0 //this指針指向的地址存入0,也就是變量a,對應語句*(int*)this=0;
00401010 |. 8B4D FC mov ecx, dword ptr [ebp-4] //this指針放入ecx(多余的一步)
00401013 |. C741 04 FFFFF>mov dword ptr [ecx+4], -1 //this指針指向的地址存入-1,也就是變量b,對應語句*(int*)(this+4)=-1;
0040101A |. 8B45 FC mov eax, dword ptr [ebp-4] //返回值放入eax
0040101D |. 8BE5 mov esp, ebp //還原先前的esp、ebp
0040101F |. 5D pop ebp
00401020 \. C3 retn
//中間代碼省略
//類B的構造函數,和a的一模一樣
00401030 /$ 55 push ebp
00401031 |. 8BEC mov ebp, esp
00401033 |. 51 push ecx
00401034 |. 894D FC mov dword ptr [ebp-4], ecx
00401037 |. 8B45 FC mov eax, dword ptr [ebp-4]
0040103A |. C700 01000000 mov dword ptr [eax], 1
00401040 |. 8B4D FC mov ecx, dword ptr [ebp-4]
00401043 |. C741 04 FEFFF>mov dword ptr [ecx+4], -2
0040104A |. 8B45 FC mov eax, dword ptr [ebp-4]
0040104D |. 8BE5 mov esp, ebp
0040104F |. 5D pop ebp
00401050 \. C3 retn
//中間代碼省略
//2個類公用一個析構函數
00401060 /$ 55 push ebp
00401061 |. 8BEC mov ebp, esp
00401063 |. 51 push ecx
00401064 |. 894D FC mov dword ptr [ebp-4], ecx
00401067 |. 8BE5 mov esp, ebp
00401069 |. 5D pop ebp
0040106A \. C3 retn
//中間代碼省略
//main()函數
00401070 /$ 55 push ebp
00401071 |. 8BEC mov ebp, esp
00401073 |. 83EC 14 sub esp, 14 //給變量分配20字節空間
00401076 |. 50 push eax //剛才的代碼標記
00401077 |. 83C4 04 add esp, 4 //剛才的代碼標記
0040107A |. 8D4D F8 lea ecx, dword ptr [ebp-8] //thiscall調用約定,this指針通過ecx傳遞
0040107D |. E8 7EFFFFFF call 00401000 //調用A構造函數
00401082 |. 53 push ebx //剛才的代碼標記
00401083 |. 53 push ebx //剛才的代碼標記
00401084 |. 83C4 08 add esp, 8 //剛才的代碼標記
00401087 |. 8D4D F0 lea ecx, dword ptr [ebp-10] //thiscall調用約定,this指針通過ecx傳遞
0040108A |. E8 A1FFFFFF call 00401030 //調用B構造函數
0040108F |. C745 EC 00000>mov dword ptr [ebp-14], 0 //函數返回值預先存儲好
00401096 |. 8D4D F0 lea ecx, dword ptr [ebp-10]
00401099 |. E8 C2FFFFFF call 00401060 //調用B析構函數
0040109E |. 8D4D F8 lea ecx, dword ptr [ebp-8]
004010A1 |. E8 BAFFFFFF call 00401060 //調用A析構函數
004010A6 |. 8B45 EC mov eax, dword ptr [ebp-14] //返回值最后放入eax
004010A9 |. 8BE5 mov esp, ebp
004010AB |. 5D pop ebp
004010AC \. C3 retn
由此可見,成員變量放在初始化列表和構造函數體內,匯編代碼是一樣的,也就是不管放在那里,是沒有差別的
posted on 2008-08-07 16:09
greatws 閱讀(2711)
評論(12) 編輯 收藏 引用