对象的内存布局(C/C++)

注意:该作者博客已迁移至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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值