1.须知
类本身是没有大小的。
类的大小指的是类的对象所占的大小。
如果用 sizeof 运算符对一个类型名操作,得到的是具有该类型实体的大小。
2.非静态成员变量(普通成员变量)
非静态成员变量(即普通成员变量),是在类的实例化过程中才在 栈区
或者 堆区
为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。
非静态成员变量(即普通成员变量),跟着类对象走,是包含在每个对象中的,占用对象的内存空间,即每个类对象都有自己的成员变量。
#include <iostream>
using namespace std;
class A
{
public:
int x;
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 4
return 0;
}
如果类中有多个成员变量,则按照定义的顺序来保存,最先声明的在最上边,然后依次保存。
在下面的代码中,person
对象的内存在栈空间,则其包含的三个成员变量的内存也在栈空间。
#include <iostream>
using namespace std;
struct Person
{
int m_id;
int m_age;
int m_height;
void display()
{
cout << m_id << " " << m_age << " " << m_height << endl;
}
};
int main()
{
Person person;
person.m_height = 3;
person.m_age = 2;
person.m_id = 1;
cout << "&person = " << &person << endl;
cout << "&person.m_id = " << &person.m_id << endl;
cout << "&person.m_age = " << &person.m_age << endl;
cout << "&person.m_height = " << &person.m_height << endl;
return 0;
}
输出结果如下:
对象的内存布局如下:
3.静态成员变量
静态成员变量在类定义时就已经在 全局/静态存储区
分配了内存,因而它是属于类的。
静态成员变量不保存在对象内部,不占用类对象的内存空间。
#include <iostream>
using namespace std;
class A
{
public:
static int x;
static int y;
};
int A::x = 0;
int A::y = 0;
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
return 0;
}
4.非静态成员函数(普通成员函数)
非静态成员函数(即普通成员函数)在类定义时放在 程序代码区
,不占用类对象的内存空间。
#include <iostream>
using namespace std;
class A
{
public:
void fun1() {};
void fun2() {};
void fun3() {};
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
obja.fun1();
obja.fun2();
obja.fun3();
return 0;
}
汇编代码如下:
5.静态成员函数
静态成员函数在类定义时放在 程序代码区
,它是属于类的,不占用类对象的内存空间。
#include <iostream>
using namespace std;
class A
{
public:
void fun1() {};
void fun2() {};
void fun3() {};
static void sfun() {};
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
return 0;
}
6.构造函数和析构函数
构造函数和析构函数不占用类对象的内存空间。
#include <iostream>
using namespace std;
class A
{
public:
A() {};
~A() {};
};
int main()
{
A obja;
cout << sizeof(obja) << endl; // 1
return 0;
}