在对象中分配列表

时间:2017-03-21 17:56:46

标签: c++ list memory

对象内的list在哪里得到它的堆栈?

下面的程序显示了40的对象大小。那么列表从哪里分配内存?

    class TEST
    {
    public:
        TEST(void);
        void Push(void);
    private:
        std::list<int> _list;
        std::list<int>::iterator _it;
        int f;
    };

    TEST::TEST(void) : f(1)
    {

    }

    void TEST::Push(void)
    {
        _list.push_back(f++);
    }

main:
    {
        TEST n;
        int a = sizeof(n);
        std::cout << a << std::endl;

        n.Push();
        a = sizeof(n);
        std::cout << a << std::endl;

        for(int r=0; r<10000; r++){
            n.Push();
        }
        a = sizeof(n);
        std::cout << a << std::endl;
    }

输出:

40 <br/>
40 <br/>
40

2 个答案:

答案 0 :(得分:1)

只是添加有关您使用sizeof()

的评论

我会在这里看看这个问题的答案: Size of class object in C++

基本上sizeof()运算符只考虑类的成员而不考虑任何关联的堆分配。虽然成员变量_list实际上只是指向堆上内存区域的指针,但无论它指的是多少项,它都保持一个常量 - 因为实际上它基本上只存储一个记忆地址。 (它显然存储了一些信息,但我希望保持简单)

因此,无论您对_list做什么,sizeof的结果都将保持不变,因为n内的实际成员保持不变。

答案 1 :(得分:0)

您可以使用公开方法std::list::get_allocator查看数据的存储位置。

以下是一个如何使用它的示例(但只是为了研究,它不应该像这样使用):

int main ()
{
  int * ptr;
  // allocate an array of 5 elements using _list's allocator:
  ptr=_list.get_allocator().allocate(5);

  // assign some values to array
  for (int i=0; i<5; ++i) ptr[i]=i;

  std::cout << "The allocated array contains:";
  for (int i=0; i<5; ++i) std::cout << ' ' << ptr[i];
  std::cout << '\n';

  _list.get_allocator().deallocate(ptr,5);

  return 0;
}

顺便说一句:用下划线命名成员不是一个好主意:

  

所有以下划线开头的标识符都保留用作   全局命名空间中的名称