繁体   English   中英

为什么我的结构比要求的需要更多 memory?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM