我根据单个链表创建了自己的堆栈,并且工作正常,但是当我 看了一下内存使用情况... 使用包含100k整数的堆栈的控制台应用程序占用6.5 MB。这太糟糕了,因为4字节* 100k = 0.38 MB。我为每个“ Unit”结构分配内存,其中一个包含指向下一个的指针,但我认为这不会占用大量内存。是什么原因引起的?
jrkfkgkglggfgirng
答案 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个字节的附加内存。所有 调试堆中生成的内存块被单个连接 链表,根据分配时间排序。