c++类实例在内存中所占字节数分析

 c++是一种面向对象的编程语言,它向下保持了对c的兼容,同时也允许程序员能够自由的操控内存,虽然会带来一些问题,但这不是我们要探讨的问题,略过不表。类是对某种对象的定义,包含变量和方法,也可以理解为现实生活中一类具有共同特征的事务的抽象,他是面向对象语言的基础。所以类是不占有内存的,可是如果类生成实例那么将会在内存中分配一块内存来存储这个类。 

    类的实例在内存中是如何分配内存的,有什么需要我们注意的,下面将慢慢到来。 

    比如下面一个类: 

//sizeof(A0)= 1 Byte

class A0

{

};

    从形式上看,它似乎什么有没有,事实上它不止隐含了一个构造函数和一个析构函数,还有一些操作符重载函数,比如“=”。如果类A被实例话,如A a;在内存会占据多大的空间呢?有人可能会说4,也有人会说0,还有人会说1,说1的就对了,为什么会是1呢?原因有很多,如果我们定义一个数组A b[10];如果上面是0,这样的局面将会很尴尬,所以A这样一个空类,编译器会给它一个字节来填充。    

增加一个变量,(字节对齐默认都是4

//sizeof(A1)= 4 Byte

class A1

{

public:

int i;

};

   类A1的实例将占据4个字节的内存,sizeof(A1) = 4

    再增加一个变量,

  //sizeof(A2)= 8 Byte

class A2

{

public:

int m;

int n;

};

   此时按照变量生命的先后顺序,i被放在低地址上,l紧随其后。

   实例占用8个字节,sizeof(A2) = 4*2 = 8 

   如果累里面含有函数且所带的参数不是成员变量: 

 //sizeof(A4)= 8 Byte

class A4

{

public:

int m;

int n;

int add(int x,int y){return (x+y);}

};

 有些人可能会说类的大小是12,事实上sizeof(A) = 8

 

 为什么会这样,这是因为sizeof访问的程序的数据段,而函数地址则被保存在代码段内,所以最后的结果是8.

 如果累里面含有函数且不含参数:

//sizeof(A5)= 8 Byte

class A5

{

public:

int m;

int n;

int add(){return (m+n);}

}; 

 再看下面这个情况,添加一个静态变量对类示例大小的影响 

//sizeof(A6)= 8 Byte

class A6

{

public:

int m;

int n;

static int s;

int add(){return (m+n);}

};

此时sizeof(A)大小仍为8,这里留给读者去思考为什么?

 

当类里面含有虚函数时,情况会如何呢?

 

//sizeof(A7)= 12 Byte

class A7

{

public:

int m;

int n;

virtual void M() {};

int add(){return (m+n);}

}; 

 因为含有虚函数,所以类里面将含有一个虚指针vptr,指向该类的虚表vtbl,一个指针占用四字节的地址,所以sizeof(A) = 12 

 虚指针放在类实例地址的最低位置, 

 比如 A *a = new A;  

 我们可以这样给变量i赋值 

int *p = (int *)a;

 p++;

 *p = 1;//i的值赋为1. 

如果类作为派生类,内存将如何分配呢? 

这种情况虽然有些复杂,但并不是说不好理解。 

他有多少个父类每个父类的大小加起来在加上自身就是sizeof的大小。 

示例代码: 

#include "stdafx.h"
#include<Windows.h>
#include <iostream>
using namespace std;
 
//sizeof(A0)= 1 Byte
class A0
{
public:
};
 
//sizeof(A1)= 4 Byte
class A1
{
public:
int i;
};
 
//sizeof(A2)= 8 Byte
class A2
{
public:
int m;
int n;
};
 
//sizeof(A3)= 16 Byte
class A3
{
public:
int i;
double d;
};
 
//sizeof(A4)= 8 Byte
class A4
{
public:
int m;
int n;
int add(int x,int y){return (x+y);}
};
 
//sizeof(A5)= 8 Byte
class A5
{
public:
int m;
int n;
int add(){return (m+n);}
};
 
//sizeof(A6)= 8 Byte
class A6
{
public:
int m;
int n;
static int s;
int add(){return (m+n);}
};
 
//sizeof(A7)= 12 Byte
class A7
{
public:
int m;
int n;
virtual void M() {};
int add(){return (m+n);}
};
 
int _tmain(int argc, _TCHAR* argv[])
{
int t0=sizeof(A0);
cout<<"类 A0 所占内存大小为 "<<t0<<" Byte"<<endl;
int t1=sizeof(A1);
cout<<"类 A1 所占内存大小为 "<<t1<<" Byte"<<endl;
int t2=sizeof(A2);
cout<<"类 A2 所占内存大小为 "<<t2<<" Byte"<<endl;
int t3=sizeof(A3);
cout<<"类 A3 所占内存大小为 "<<t3<<" Byte"<<endl;
int t4=sizeof(A4);
cout<<"类 A4 所占内存大小为 "<<t4<<" Byte"<<endl;
int t5=sizeof(A5);
cout<<"类 A5 所占内存大小为 "<<t5<<" Byte"<<endl;
int t6=sizeof(A6);
cout<<"类 A6 所占内存大小为 "<<t6<<" Byte"<<endl;
int t7=sizeof(A7);
cout<<"类 A7 所占内存大小为 "<<t7<<" Byte"<<endl;
system("pause");
return 0;
} 

运行结果:

 

  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值