- 类的内存分配(注意内存对齐)
设指针的内存占ptr_size字节(32位是4字节,64位是8字节)
1.普通类
class A{
public:
int a;//4个字节
char b;//1个字节
void f(){//不占内存
cout<<"A"<<endl;
}
};
A a;
cout<<sizeof(A)<<" "<<sizeof(a)<<endl;//out: 8 8(字节对齐)
2.含有虚函数的类
class A{
public:
int a;//4个字节
char b;//1个字节
virtual void f(){//虚指针站内存ptr_size
cout<<"A"<<endl;
}
};
A a;
cout<<sizeof(A)<<" "<<sizeof(a)<<endl;//out: 16 16(4+1+8字节对齐后为16)
3.继承类
class A{
public:
int a;//4个字节
char b;//1个字节
virtual void f(){//虚指针站内存ptr_size(无论几个虚函数只有一个虚指针)
cout<<"A"<<endl;
}
virtual void g(){//虚指针站内存ptr_size
cout<<"A"<<endl;
}
};
class B:public A{//继承了A的int、char 和虚指针
int c;//4字节
};
cout<<sizeof(B)<<endl; //out:24(4+1+4+8字节对齐24)
4.多继承
class A{
virtual void f(){}
virtual void g(){}
};
class B{
virtual void h(){}
};
class C:public A,public B{
...
};
cout<<sizeof(C)<<endl;//out:16(继承了一个A的虚指针,B一个虚指针)
赋值问题
int a=1;
int main(){
int a=a;//此时右值a为局部变量,值不确定,实测输出为0(很危险)
int x=2,y=3,z;
z=(x==y);//z为0,相等返回1
z=(x=y=5);//x,y,z均为
}
位运算
int x;
x=x&(x-1);//x二进制中最右边1变为0,即x的1的个数减1
函数参数压栈顺序
从右往左
int arr[4]={6,7,8,9};
int *ptr=arr;
printf("%d","%d",*ptr,*(++ptr));//out:7 7(从右往左压栈)