zoukankan      html  css  js  c++  java
  • C++中各种类成员的内存分布

    在C++中,标准库里面的容器,如vector,list都可以动态增长,如果把这些容器作为某个class的成员,那么这个class的内存是怎么分配的呢?

    写了一个简单的程序测试一下,如下,

    #include <string>
    #include <vector>
    #include <list>
    #include <iostream>
    using std::string;
    using std::vector;
    using std::list;
    using std::cout;
    using std::endl;
    
    class Elem
    {
    public:
        Elem(int i,string s):index(i),name(s){
            for(int k=0;k<index;k++)
            {
                array.push_back(k);
                tlist.push_back(name);
            }
        }
        void PrintMemAddr(){
            cout << "address test:" << endl;
            cout << "\tthis:\t" << (this) << endl;
            cout << "\tindex:\t" << (&index) << endl;
            cout << "\tarray:\t" << (&array) << endl;
            cout << "\tname:\t" << (&name) << endl;
            cout << "\tlist:\t" << (&tlist) << endl;
        }
    
    private:
        int index;
        vector<int> array;
        string name;
        list<string> tlist;
    };

    主函数程序如下,

    int main()
    {
        //double t = 3.14;
        int t = 3;
        cout << "t:\t" << (&t) << endl;
    
        Elem a(7,"hello");
        a.PrintMemAddr();
    
        string s = "hello, who are you?";
        cout << "s:\t" << (&s) << endl;
    
        Elem b(7,"hello");
        b.PrintMemAddr();
    
        double d = 3.14;
        cout << "d:\t" << (&d) << endl;
    
        Elem* c = new Elem(17,"who");
        c->PrintMemAddr();
    
        return 0;
    }

    最后输出结果如下,

    t:    0xbfb55664
    address test:
        this:    0xbfb55620
        index:    0xbfb55620
        array:    0xbfb55624
        name:    0xbfb55630
        list:    0xbfb55634
    s:    0xbfb5566c
    address test:
        this:    0xbfb5563c
        index:    0xbfb5563c
        array:    0xbfb55640
        name:    0xbfb5564c
        list:    0xbfb55650
    d:    0xbfb55658
    address test:
        this:    0x86df1a8
        index:    0x86df1a8
        array:    0x86df1ac
        name:    0x86df1b8
        list:    0x86df1bc

    可以看出,在class里面,数据成员的地址与class里面的顺序一致,vector或者list虽然是动态数据结构,但是放在vector或者list里面的数据并不是放在它们自己的空间里面的,所以它们在class里面所占用的空间是固定的,然后在main函数里面,数据应该都是在栈上的,c是堆上的,地址明显与其它的不太一致。然而,a和b的地址,也就是前两个class的输出,地址基本上连续,潜在它们中间的几个变量,地址不是按先后顺序的,而且是接在a和b后面的,谁能帮我解释下么?

  • 相关阅读:
    Saltstack module gem 详解
    Saltstack module freezer 详解
    Saltstack module firewalld 详解
    Saltstack module file 详解
    Saltstack module event 详解
    Saltstack module etcd 详解
    Saltstack module environ 详解
    Saltstack module drbd 详解
    Saltstack module dnsutil 详解
    获取主页_剥离百度
  • 原文地址:https://www.cnblogs.com/Frandy/p/class_mem_byte.html
Copyright © 2011-2022 走看看