C/C++注意点

  • 类的内存分配(注意内存对齐)
    设指针的内存占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(从右往左压栈)

猜你喜欢

转载自blog.csdn.net/weixin_41127779/article/details/82147547