类在内存中的分配

对于一个声明好的类,里面可能有成员函数,静态成员函数,成员变量,静态成员变量,虚函数等,那么这些数据都是怎么分配到内存的呢?


class A{   //一个简单的类,方便下面描述信息
public:
void Show(){ cout<<”I am A”<<endl;}
int a;
char b;
double c;
};
int main(){
A a;
a. Show ();
}


下面给出一些结论以及一些简单的分析:

1.       类的普通成员函数以及静态成员函数不占内存

          类的成员函数实际上与普通的全局函数类似,只不过在编译的时候会在成员函数上加一个指针(this)形参,(这非常重要)比如上面的方法可以理解为Show&a;这   样调用Show的时候就传入了a的地址。成员函数的地址是全局已知的,对象内存无需保存,对象也并不知道它各个函数的地址(这里理解是其他的途径先调用该函数,再把对象传入函数的形参中)

2.      有虚函数的类中会有一个维护虚函数表的指针,这样会占4个字节,64位编译器是可能是8个字节。

3.      类的属性(成员变量),在实例化一个对象时就为这些数据成员分配了内存,而且他们是相互独立的。

4.      静态成员函数与一般成员函数的区别是没有this指针,因此不能访问非静态的数据成员。

5.      程序中的所有函数位于代码区(C语言内存分配中有代码区用于存放CPU执行的机器指令与代码等,其中还有data数据区,BSS区,堆栈)

6.       静态数据成员不属于某个对象(未初始化的存储在bss区,初始化的存储在data区)

7.      成员变量所占大小存在内存对齐机制(在Struct中也是一样的)

         比如上面的a,b,c分别是int,char,double类型,sizeof(int)+sizeof(char)<sizeof(double)。这里简单说一下对齐机制,首先第一个成员变量是int,所以先申请4个字节的大小,接下来是一个char,一个字节紧跟在int后面,然后double来了,它以为内存是按照自己的整数倍来分配的(每个关键字都是这么认为的),所以会直接空出8个字节(也就是char后面空出来3个字节),再进行添加。最后要以double类型为基础单位来占用内存(必须是double大小的整数倍)。

8.       空类占一个字节

          空类也需要实例化,实例化必须要在内存中分配一块地址,编译器一般会默认添加一个字节

转载于:https://www.cnblogs.com/soft4/p/5078736.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值