sizeof对象空间布局
结论
- 非静态成员变量 所占空间
- 编译器为CPU所做的数据对齐处理
- 支持虚函数所产生的虚函数表,指针
(即为类对象所占空间大小)
以下依次举例说明:
- C++中每个空类型的实例或者此类需要占 l Byte 空间
(注意:构造函数和析构函数不占用对象空间)
#include <iostream>
using namespace std;
class A
{
public:
A(){};
~A(){};
private:
};
int main()
{
A my_class1;
cout<<sizeof(my_class1)<<endl;
return 0;
}
- 静态数据成员是不占对象的内存空间的,只拥有一份实例,所有对象共有
#include <iostream>
#include <stdlib.h>
using namespace std;
class a{
public:
a(){};
~a(){};
private:
static int b;
};
int main(void)
{
int c = sizeof(a);
cout<<c<<endl;
a a1;
cout<<sizeof(a1)<<endl;
return 0;
}
- 普通成员 (数据,函数)
普通函数和数据也是不占用空间的
注意: 在Linux下面,程序运行时候,由于系统装载至内存,而占据在代码段,数据段,未初始化段,并且代码段是不能修改的,故只读而不能写,为此程序的所以fork进程共享
#include <iostream>
using namespace std;
class A
{
public:
A(){};
~A(){};
private:
int a;
double b;
char c;
};
class B
{
public:
void func(){
}
private:
};
int main()
{
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;
A my_class1;
B my_class2;
cout<<sizeof(my_class1)<<endl;
cout<<sizeof(my_class2)<<endl;
return 0;
}
- 虚析构函数
含有指向虚函数表的指针
#include<iostream>
using namespace std ;
class A{};
class B{};
class C:public A{
};
class D: public virtual B{};
class E :public A, public B{
};
int main(){
A a;
B b;
C c;
D d;
E e;
cout<<"sizeof(a)"<<sizeof(a)<<endl;
cout<<"sizeof(b)"<<sizeof(b)<<endl;
cout<<"sizeof(c)"<<sizeof(c)<<endl;
cout<<"sizeof(d)"<<sizeof(d)<<endl;
cout<<"sizeof(e)"<<sizeof(e)<<endl;
return 0;
}