微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 std::stack 内存大小比 C++ 中的通常大?

如何解决为什么 std::stack 内存大小比 C++ 中的通常大?

这是测试我的问题的代码

#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 个字节。但是,当我在 Stack 中初始化 int 数据类型的 std::stack 时,Stack 大小为 80 字节。

应该是 4 吗?为什么 std::stack 需要 80 个字节?或者 80 字节大小的堆栈内部实际上是什么?

解决方法

sizeof 获取对象/类型的静态大小。 stack 为其元素动态分配内存。因此,元素的大小与 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_base,它有一个 _Deque_impl_data 类型的成员)

指针和整数是 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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。