c++ class 实例化在内存空间布局
内存对齐
先上程序
class Base1 {
public:
int t;
double a;
};
我们看一下Base1类在内存布局
Base1在内存中占用16个字节,这是因为Base1要以它成员变量所占最大字节的整数倍来开辟内存,这里因为double是8字节,所以int 自动补齐,所以是16个字节
class Base1 {
public:
int t;
double a;
private:
char c;
};
我们在private中定义一个char类型的变量,也需要对齐
所以不管类中成员变量的属性如何变化,都需要按照成员变量最大字节的整数倍来对齐
虚函数及虚表指针的内存开辟
我们知道在类中如果有虚函数,那么类的构造函数是会构造出一个虚表指针的,一般为4个字节
class Base1 {
public:
int t;
virtual void f1() {
}
private:
double m;
char c;
};
class Base1 {
public:
int t;
virtual void f1() {
}
private:
//double m;
char c;
};
发现了什么,虚表指针也需要对齐
class Base1 {
public:
int t;
virtual void f1() {
}
private:
//double m;
char c;
};
class Base2 {
virtual void m(){
}
};
class Derived : public Base1,Base2 {
char l;
virtual int f() {
return 0;
}
};
对于派生类,需要先调用基类的构造函数,再调用子类的构造函数
class Base1 {
public:
int t;
virtual void f1() {
}
private:
double m;
char c;
};
class Base2 {
virtual void m(){
}
};
class Derived : public Base1,Base2 {
char l;
virtual int f() {
return 0;
}
};
class Base1 {
public:
int t;
static int st;
double m;
void f0() {
}
virtual void f1() {
}
private:
char c;
};
在加入成员函数和静态变量后,内存并没有变化,这是因为成员函数和静态变量都是在静态区开辟空间,因为在实例化对象的时候总不能为每个对象都要开辟一个内存区存放函数吧。而const和static不同,它需要在类内开辟空间。