为什么在c++中std::堆栈内存大小比平时大



这是测试我的问题的代码。

#include <iostream>
#include <stack>
using namespace std;
int main(){
int num;
int Array[1];
stack<int> Stack;
cout << "Int size " << sizeof(num) <<endl; // Output: Int size 4
cout << "Array size " << sizeof(num) <<endl; // Output: Array size 4
cout << "Stack size " << sizeof(Stack) <<endl; // Output: Stack size 80
return 0;
}

我正在努力理解内存空间分配的问题。通常int内存大小为4字节。但是,当我在std::stack中初始化int数据类型的Stack时,Stack的大小是80字节。

应该是4号吗?为什么std::stack占用80字节?或者,对于大小为80字节的堆栈,其内部实际上是什么?

sizeof获取对象/类型的静态大小。CCD_ 6为其元素动态地分配内存。所以,元素的大小和stack的大小一般不存在相关性。那么,为什么是80字节呢?这是高度针对具体实施的。堆栈的大小通常与底层容器的大小相同。默认情况下,底层容器是一个std::deque,因此我们必须查看它。我特别检查了libstdc++,它似乎有1个指针,1个size_t表示大小,2个迭代器如下:

struct _Deque_impl_data
{
_Map_pointer _M_map;
size_t _M_map_size;
iterator _M_start;
iterator _M_finish;
//...

(std::deque源自具有_Deque_impl_data类型的单个成员的_Deque_base(

指针和整数为8字节,迭代器为32字节。这总计80个字节。我没有进一步研究,但由于deque是一个更复杂的结构,它需要一些内存来自己记账是很自然的。

您可能会混淆sizeof(Stack)Stack.size()sizeof运算符返回类对象的总大小,在std::stack的情况下,该类对象包括(必要的(许多内部数据和控制变量(在您的情况下将大小填充为80字节(。但是,对Stack.size()的调用将返回当前堆栈上项目数

这些"内部变量"将包括指向已分配内存的指针(可能是8字节(、记录当前元素计数的值(也可能是8个字节(以及许多其他指针和计数器,以帮助操作堆栈和优化对所含数据的访问,如已分配空间的当前容量等。

以下修改后的代码显示了差异:

#include <iostream>
#include <stack>
using namespace std;
int main()
{
int num;
int Array[1];
stack<int> Stack;
cout << "Int size " << sizeof(num) << endl;     // Int size 4
cout << "Array size " << sizeof(Array) << endl; // Array size 4 (1 "int" element)
cout << "Stack size " << sizeof(Stack) << endl; // Size of a "std::stack<int>" instance
cout << "Stack size " << Stack.size() << endl;  // Size (# entries) of stack = 0 (empty)
return 0;
}

最新更新