无语。发现 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的地址
结论:
把类的第一个成员变量的地址压入栈。