• C++学习笔记----2.4 C++对象的内存模型


    转载自:http://c.biancheng.NET/cpp/biancheng/view/2995.html点击打开链接

    当对象被创建时,编译器会为每个对象分配内存空间,包括成员变量和成员函数。

    直观的认识是,如果定义了10个对象,那么就要分别为这10个对象的变量和函数分配内存空间,如下图所示:


    虽然每个对象的成员变量不同,但是成员函数的代码却是一样的,上面的内存模型保存了10份相同的代码片段,浪费了很多空间。

    事实上,编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段函数代码。如下图所示:


    请看下面的一个例子:

    [cpp] view plain copy
     
    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. class Demo{  
    5. public:  
    6.     int a;  
    7.     float b;  
    8.     void display();  
    9. };  
    10. void Demo::display(){  
    11.     cout<<"a="<<a<<", b="<<b<<endl;  
    12. }  
    13.   
    14. int main(){  
    15.     Demo obj;  
    16.     obj.a = 1;  
    17.     obj.b = 2;  
    18.     obj.display();  
    19.   
    20.     return 0;  
    21. }  


    obj 既是对象,也是 main 函数中的局部变量,类型为 Demo,它和通过 int、char 等定义出来的普通变量一样,都在栈区分配内存。

    假设 obj 的起始地址为 0X1000,那么它的内存分布如下图所示:


    a、b 都为 int 类型,占用4个字节内存,并且按照声明时的顺序依次排列,所以 obj 对象总共占用8个字节的内存。读者可以使用sizeof(obj)语句亲测。

    对象的大小只受成员变量的影响,和成员函数没有关系。成员函数在代码区分配内存,而不是在栈区。

  • 相关阅读:
    消息队列之kafka
    注册中心ZooKeeper
    消息队列之RocketMQ集群部署
    消息队列之RocketMQ简介及单机部署
    消息队列之RabbitMQ
    消息队列简介
    debian10入门(切换root用户,更改网卡配置,及更新apt源配置)
    实体间的关系
    MySQL数据库的基础使用命令大全
    ReletiveLayout布局的一些常用属性
  • 原文地址:https://www.cnblogs.com/haoyul/p/7257707.html
Copyright © 2020-2023  润新知