注意:该作者博客已迁移至https://buxianshan.xyz
例题:
#include<iostream>
using namespace std;
class simpleClass
{
public:
static int nCount;
int c;
short nValue;
simpleClass();
virtual ~simpleClass();
int getValue(void);
virtual void foo(void);
static void addCount();
};
int main() {
cout << "sizeof(simpleClass):" << sizeof(simpleClass);
}
输出:
sizeof(simpleClass):12
分析:
虚函数表指针(4个字节)+ int(4个字节)+ short(2个字节)+ 内存对齐(2个字节)= 12
(有关内存对齐,请看https://blog.csdn.net/qq_43479622/article/details/90049762 )
对象的内存布局:
- 一个类可能有静态成员数据、非静态成员数据、静态成员函数和非静态成员函数,其中还可能有虚函数。
- 静态数据成员由所有对象共享,所以sizeof(对象)得到的字节数中,不包括静态数据成员占用的内存。
- 非静态数据成员是影响对象占据内存大小的主要因素,随对象数目增加而增加。
- 成员函数(静态/非静态)不影响对象内存大小,也不会随对象数目增加而增加。sizeof(对象)得到的字节数中也不包括成员函数,但是成员函数的实现会占据相应的内存空间。
- 如果对象中包含虚函数,则会在对象占用内存开始处增加4个字节(无论虚函数有多少个)。这4个字节是指向“虚函数表”的指针,即指向一个函数地址表,函数地址再指向对应的函数实现。这一设置的目的是支持多态性,因为虚函数使得只有在程序运行时,才能决定调用的是父类或是子类中的实现,因此每一个对象有这样一个虚函数表指针。
感谢:李昕老师(CUMT)