c++对象的内存布局(一)

本文探讨了C++中对象的内存布局,包括空类的实际大小为何不是零、简单类的数据成员与函数成员如何分开存储及其原因。通过具体示例说明了编译器如何处理这些情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要讨论c++对像的内存布局。对于一个简单的或者是复杂的c++类,他在内存里到底是怎么储存的呢?

每个类都有数据成员和接口,它们的存储方式一样吗?虚函数为什么会带来存储上的开销?类的静态成员和非静态成员有什么区别呢? 本文将为你揭晓这些问题的答案。

 

一个空的类: 

class Test{

}

c++支持一个空类,这个空类什么定义都没有,什么都不做。那sizeof(Test)是0吗?

答案不是的。sizeof(Test)的大小一般是一。编译器会插入一个占位字节。为什么呢? 

给出以下语句:

Test a[10];一个test的数组,如果test的大小是0,那么显然,就没法取得a的每个元素了。

a[0], a[1]地址是一样的,这就产生了矛盾。

既然空类什么都不做,那空类有什么用吗?答案是肯定的。c++的非虚成员函数是单独存放的,所以只有函数的类实际上也是一个空类。而实际应用里,这些类太常见了。另外的一个用途是作为标签类,用在模板里。STL的模板traits就有很多空类。

 

 

一个简单的类: 

class A{

  int x_;

  int y_;

  int z_;

 public :

  A(int x, int y,int z): x_(x),y_(y),z_(z) {}

  int getx() const { return x_}

}

这个类的内存布局是这样的:

类的内存布局里只有数据成员。

函数成员并没有存在一起。函数成员是单独存放的。为什么可以单独存放?一般的成员函数第一个实际上是隐藏的this指针,这个this指针将函数成员和数据成员联接在一起了。这样就实现了单独存放。

所以对于一个A的实例a,sizeof(a)其实等于三个int的大小。不考虑内存对齐的特殊情况,是3*sizeof(int)

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值