对象内的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
答案 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;
}
顺便说一句:用下划线命名成员不是一个好主意:
所有以下划线开头的标识符都保留用作 全局命名空间中的名称