無語。發現 windows live writer 跟google輸入法有沖突。把邊欄打開,輸入法就用不了。
繼續函數的傳值。現在應該是按引用傳遞了。看代碼:
class A
{
public:
int i;
int ii;
int iii;
char iiii;
char iiiii;
};
void fun1(A* a){
a->iiii = 'a';
a->iiiii = 'b';
}
void fun2(A& a){
a.iiii = 'c';
a.iiiii = 'd';
}
fun1的匯編:
push ebp
mov ebp, esp
mov eax, dword ptr ss:[ebp+8]
mov byte ptr ds:[eax+C], 61
mov ecx, dword ptr ss:[ebp+8]
mov byte ptr ds:[ecx+D], 62
pop ebp
retn
fun2的匯編:
push ebp
mov ebp, esp
mov eax, dword ptr ss:[ebp+8]
mov byte ptr ds:[eax+C], 63
mov ecx, dword ptr ss:[ebp+8]
mov byte ptr ds:[ecx+D], 64
pop ebp
retn
有區別嗎?沒區別。指針,引用一樣。
看調用的:
A a;
a.iii = 1;
fun1(&a);
匯編
mov dword ptr ss:[ebp-8], 1 ;a.iii賦值
lea eax, dword ptr ss:[ebp-10] ;a的地址
push eax ;a的地址壓入棧
call 00401000 ;fun1的地址
A b;
b.iii = 2;
fun2(b);
匯編
mov dword ptr ss:[ebp-18], 2 ;b.iii賦值
lea ecx, dword ptr ss:[ebp-20] ;b的地址
push ecx ;b的地址壓入棧
call 00401020 ;fun2的地址
結論:
把類的第一個成員變量的地址壓入棧。