美文网首页C/C++学习笔记
C++ 对象的内存模型

C++ 对象的内存模型

作者: 零岁的我 | 来源:发表于2020-04-25 10:38 被阅读0次

    转载自:http://c.biancheng.net/cpp/biancheng/view/2995.html


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

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


    image.png

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

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


    image.png

    请看下面的一个例子:

        #include<iostream>
        using namespace std;
     
        class Demo{
        public:
            int a;
            float b;
            void display();
        };
        void Demo::display(){
            cout<<"a="<<a<<", b="<<b<<endl;
        }
     
        int main(){
            Demo obj;
            obj.a = 1;
            obj.b = 2;
            obj.display();
     
            return 0;
        }
    

    obj 既是对象,也是 main 函数中的局部变量,类型为 Demo,它和通过 int、char 等定义出来的普通变量一样,都在栈区分配内存。
    a、b分别为int类型和float类型,都占用4个字节内存,并且按照声明的顺序依次排列,所以obj对象总共占用8个字节的内存。可以使用sizeof(obj)语句测试。
    对象的大小只受成员变量的影响,和成员函数没有关系。成员函数在代码区分配内存,而不是在栈区。

    相关文章

      网友评论

        本文标题:C++ 对象的内存模型

        本文链接:https://www.haomeiwen.com/subject/fhuhwhtx.html