C++类对象所占的内存空间
Posted Sherlock的程序人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类对象所占的内存空间相关的知识,希望对你有一定的参考价值。
1、说明
一个类的实例化对象所占空间的大小?注意不要说类的大小,是类的对象的大小。首先,类的大小是什么?确切的说,类只是一个类型的定义,它是没有大小可言的,用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小
2、类对象所占内存空间
注,以下程序均以x86下的32位程序作为参考
2.1、空类
空类占用的内存大小为1个字节
class A
{};
int main()
{
A obj;
int nLen = sizeof(obj);
cout << nLen << endl; //sizeof(一个空类)为什么等于1?
return 0;
}
可以看到一个空类对象的大小1.
一个空类对象的大小是1,为什么不是0?
2.2、类成员方法
class A
{
public:
void func1() { };
void func2() { };
void func3() { };
};
int main()
{
A obj;
int nLen = sizeof(obj);
cout << nLen << endl; //sizeof(一个空类)为什么等于1?
return 0;
}
可见,成员函数不占用类对象的内存空间
2.3、成员变量
class A
{
public:
void func1() { };
void func2() { };
void func3() { };
char ab;
};
int main()
{
A obj;
int nLen = sizeof(obj);
cout << nLen << endl; //
obj.ab = 'c';
return 0;
}
class A
{
public:
void func1() { };
void func2() { };
void func3() { };
//char ab;
int nab;
};
int main()
{
A obj;
int nLen = sizeof(obj);
cout << nLen << endl; //
//obj.ab = 'c';
obj.nab = 12;
return 0;
}
对比上面两个例子,可以发现,
-
类成员变量会占用类对象的内存空间; -
如果不是空类,则编译器不需要隐含分配一个字节的内存;
2.4、虚函数
class A{};
class B{};
class C : public A
{
virtual void func() = 0;
};
class D : public B, public C
{};
int main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
cout << sizeof(D) << endl;
return 0;
}
类C因为有虚函数,所有实例之后,有 虚函数表,所以大小为4
类D由B和C派生而来,大小应该是5,为什么是8呢?因为内存对齐
2.5、静态成员
#include <iostream>
using namespace std;
class A
{
public:
A(int a) { x = a; }
void func(){ cout << x << endl; }
~A() { }
private:
int x;
int g;
};
class B
{
public:
private:
int a;
int b;
static int xs;
};
int B::xs = 20;
int main()
{
A a(10);
//a.func();
B b;
cout << sizeof(a) << endl;
cout << sizeof(b) << endl;
return 0;
}
上例子中,可以发现,静态成员是不占用对象的内存空间的
3、结论
综合第二节中的例子,可以得出C++中类对象所占空间大小的几点规律:
-
类对象所占空间为其内部所有非静态成员数据类型大小之和(受内存对齐影响); -
若果虚函数,则有虚函数表,多一个指针的大小; -
空类会默认分配一个字节内存; -
成员函数(包括构造函数和析构函数)均不占类对象空间;
以上是关于C++类对象所占的内存空间的主要内容,如果未能解决你的问题,请参考以下文章