[英]Why does vector of same size takes more memory than array in leetcode
[英]why my struct takes more memory than requested?
我正在使用 Visual Studio 2019 诊断工具测试以下代码。
它说 memory 消耗是 55 KB,而不是我之前计算的 20 KB。 如您所见,它比我想象的要多得多 memory,我不知道为什么。
我想知道的是:发生了什么或者我如何计算正确的 memory 消费? (因为我并不总是手头有“诊断工具”。)
#include <iostream>
#define TEST_SIZE_ARR 1000
struct Node
{
Node(int)
: id(0),
time(0),
next(0),
back(0)
{}
int id;
int time;
Node* next;
Node* back;
};
int main()
{
int counter = 0;
std::cout << "= Node =" << std::endl;
std::cout << "Array size: " << sizeof(Node*) << " * " << TEST_SIZE_ARR << " = " << sizeof(Node*) * TEST_SIZE_ARR << std::endl;
std::cout << "Element size: " << sizeof(Node) << " * " << TEST_SIZE_ARR << " = " << sizeof(Node) * TEST_SIZE_ARR << std::endl;
Node **dataArr = new Node*[TEST_SIZE_ARR]; //break point
for (counter = 0; counter < TEST_SIZE_ARR; counter++) //break point
{
dataArr[counter] = new Node(counter);
}
counter++; //break point
return 0;
}
安慰:
Array size: 4 * 1000 = 4000
Element size: 16 * 1000 = 16000
诊断工具:
Array size: 3.94 KB
Element size: 50.78 KB
您的诊断工具正在测量每次分配 36 字节的分配开销。
50.78 KB 是 52000 字节,或者每个元素分配 52 字节。 负 16 是 36 个字节。
4000 字节加上 36 字节的开销是 4036 字节,即 3.94 KB。
堆必须跟踪 memory 的哪些块正在使用,哪些没有。 可能您的诊断工具有额外的开销和愚蠢的自我措施; 我不知道。
在您的情况下,它似乎为从new
返回的每个值额外添加了 36 个字节。 您的系统似乎是 32 位指针 (ick),所以这足以容纳 9 个指针。 您可能希望在其块中包括每个分配的大小,在 32 位系统上为 4 个字节。 剩下 8 个指针。
我不知道你的堆使用这 8 个指针做什么。 也许是跳过列表,或者是红黑树,甚至是每个分配周围的一些缓冲区,以检测 memory 损坏,因为您分析了调试构建和堆。
一般来说,小的堆分配是低效的,也是一个坏主意。 这是为什么像 std vector 这样的块容器是好主意而节点容器是不确定的原因之一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.