C++ : 对象/结构体内存模型及内存大小

1.类及对象

约定:

首先单纯的声明一个类A ,如果A没有被实例化,那么A是不会占用内存空间。这里的类可以理解为一种特殊数据结构类型。

对象:一个类实例化后就变成一个对象,且对象活跃在内存中,所以类被实例化,本质也是在内存中开辟一段空间来存储类,这段内存空间就叫对象。


那么一个对象被实例化之后,会申请多大的内存空间了?多大的空间取决与这个对象对应的类包含哪些数据,即对象的大小是它的数据成员所占存储空间之和,就和结构体一样

1.1 :这个类是空类


#include<iostream.h>
 
using namespace std;
 
class A {

};

int main() {
    
    A a; 
    cout << "size of a 内存字节大小=" << sizeof(a) << endl;
    cout << "size of a 地址为:" << &a << endl;


}

打印结果:
size of a 内存字节大小=1
size of a 地址为:00000065C07BF944

结论:一个空类存的实例 会分配 一个字节内存大小
原因:记着把一个空类 实例化时 就会分配一字节
文献: To ensure that the addresses of two different objects will be different.” 就用那1byte来在内存中占用不同地址了。又因为这些空class没有赋值的意义,所以就没必要占用更多内存

1.2 : 有一个成员函数

class A {
    public:
    int fun() {
         return 0;
    }

};

int main() {
    
    A b; 
    cout << "size of b 对象b分配的内存大小=" << sizeof(b) << endl;
    cout << "size of b 对象b分配的内存地址=" << &b << endl;


}


结果 :
size of b 对象b分配的内存大小=1
size of b 对象b分配的内存地址=0000006F1B6FF6E4

结论: 在一个类中定义一个函数,这个类实例化后,不分配内存空间
因为类中定义的函数,不能算作对象的成员,因此不能再对象的存储空间内。

1.3 : 有一个虚函数


class A {
    // 定义打印的虚函数
    public:
    virtual void print() { 
        cout << "This is A" << endl;
       
    }
};



int main() {

    A b;
    cout << "size of b 对象b分配的内存大小=" << sizeof(b) << endl;
    cout << "size of b 对象b分配的内存地址=" << &b << endl;


}

结果: 
size of b 对象b分配的内存大小=8
size of b 对象b分配的内存地址=0000009C170FF818

结论:
  1:虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的。

  2:如果在 64位操作系统中,需要占用8个字节。

1.4 这个类存在成员变量和静态变量

class A { 
	private:
		int data;
		static int data1;
};

int main() {

    A b;
    cout << "size of b 对象b分配的内存大小=" << sizeof(b) << endl;
    cout << "size of b 对象b分配的内存地址=" << &b << endl;


}


结果:
 size of b 对象b分配的内存大小=4
size of b 对象b分配的内存地址=000000FAB43CF764

结论:
 类中的静态成员变量不占类的内存;
 并且静态成员变量的初始化必须在类外初始化
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值