为什么我的自定义堆栈类使用了如此多的内存?

时间:2019-05-18 11:37:41

标签: c++ memory-management stack

我根据单个链表创建了自己的堆栈,并且工作正常,但是当我 看了一下内存使用情况... 使用包含100k整数的堆栈的控制台应用程序占用6.5 MB。这太糟糕了,因为4字节* 100k = 0.38 MB。我为每个“ Unit”结构分配内存,其中一个包含指向下一个的指针,但我认为这不会占用大量内存。是什么原因引起的?

jrkfkgkglggfgirng

1 个答案:

答案 0 :(得分:3)

在计算大小时,您没有考虑指针的大小以及该结构可能具有的任何填充。平台上的指针可能是4或8个字节。此处讨论了填充:Struct padding in C++

我在构造函数中为堆栈添加了一个cout,以显示结构Unit的大小:

#include <iostream>
template<typename T>
Stack<T>::Stack()
{
    top = nullptr;
    count = 0;

    std::cout << "The size of each unit is "  << sizeof(Unit) << " bytes." << std::endl;
} 

// Rest of code is copied directly from the question.

int main() {

    Stack<int> myStack;

    return 0;
}

结果是:

The size of each unit is 16 bytes.

完整的示例在这里:https://ideone.com/TWPvDv

编辑:

看到提出问题的人正在使用Visual Studio之后,我进行了一些附加的调试以了解情况。在调试模式下,调试运行时会为每个分配添加额外的空间,以进行堆损坏检测和堆跟踪。我在main结束之前设置了一个断点,并查看了TaskManager中的内存使用情况(是不是最准确的测量)。在“调试”模式下,整个应用程序使用了12MB以上的内存,而在“发布”版本中,总内存使用量为2.6MB。

有关每个块的附加分配的信息在这里:

https://docs.microsoft.com/en-us/visualstudio/debugger/crt-debug-heap-details?view=vs-2019

  

堆函数的Debug版本调用标准或基础   版本中使用的版本。当您请求一个内存块时,   调试堆管理器从基本堆中分配一个稍大的值   超出请求的内存块,并返回指向您的部分的指针   该街区。例如,假设您的应用程序包含   调用:malloc(10)。在发布版本中,malloc将调用基   堆分配例程请求分配10个字节。在一个   调试版本,但是,malloc将调用_malloc_dbg,然后它将   调用基本堆分配例程,请求分配10   个字节加上大约36个字节的附加内存。所有   调试堆中生成的内存块被单个连接   链表,根据分配时间排序。