Nai*_*iem 1 c++ stack gcc memory-management libstdc++
这是测试我的问题的代码。
#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;
}
Run Code Online (Sandbox Code Playgroud)
我试图了解内存空间分配。通常 int 内存大小为 4 个字节。但是,当我初始化一个Stackint 数据类型时std::stack,Stack大小为 80 字节。
应该是4吗?为什么要std::stack占用 80 个字节?或者堆栈内部实际上是什么大小为 80 字节?
sizeof获取对象/类型的静态大小。stack为其元素动态分配内存。因此,元素的大小与stack一般的大小之间没有相关性。那么,为什么是 80 字节呢?这是高度特定于实现的。堆栈的大小通常与底层容器相同。默认情况下,底层容器是 a 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;
//...
Run Code Online (Sandbox Code Playgroud)
(std::deque派生自_Deque_basewhich 有一个类型的成员_Deque_impl_data)
指针和整数为 8 个字节,迭代器为 32 个字节。这加起来为 80 个字节。我没有进一步调查,但由于deque是一个更复杂的结构,它需要一些内存来进行自己的簿记是很自然的。