为什么动态内存分配在规模上不是线性的?

时间:2014-06-09 11:03:00

标签: c++ windows visual-studio-2012 memory-management

我正在调查数据结构以满足O(1)get操作,并遇到了一个名为Trie的结构。

我已经实现了以下简单的Trie结构来保存数字(仅限数字)。

忽略内存泄漏 - 这不是主题:)

Data类中的实际存储空间也不相关。

#include <sstream>
#include <string>

struct Data
{
    Data(): m_nData(0){}
    int m_nData;
};

struct Node
{
    Node(): m_pData(NULL)
    {
        for (size_t n = 0; n < 10; n++)
        {
            digits[n] = NULL;
        }
    }

    void m_zAddPartialNumber(std::string sNumber)
    {
        if (sNumber.empty() == true)   // last digit
        {
            m_pData = new Data;
            m_pData->m_nData = 1;
        }
        else
        {
            size_t nDigit = *(sNumber.begin()) - '0';
            if (digits[nDigit] == NULL)
            {
                digits[nDigit] = new Node;
            }

            digits[nDigit]->m_zAddPartialNumber(sNumber.substr(1, sNumber.length() - 1));
        }        
    }
    Data* m_pData;
    Node* digits[10];
};

struct DB
{
    DB() : root(NULL){}

    void m_zAddNumber(std::string sNumber)
    {
        if (root == NULL)
        {
            root = new Node;
        }
        root->m_zAddPartialNumber(sNumber);        
    }

    Node* root;
};


int main()
{
    DB oDB;

    for (size_t nNumber = 0; nNumber <= 10000; nNumber++)
    {
        std::ostringstream convert;
        convert << nNumber;
        std::string sNumber = convert.str();

        oDB.m_zAddNumber(sNumber);
    }

    return 0;
}

我的主要功能是简单地在数据结构中插入数字。 我已经检查了使用Windows任务管理器分配的整体内存,并且遇到了一个我无法解释的有趣功能,并且正在寻求您的建议。

我重新执行了我的简单程序,在结构中插入了不同的数字(改变for循环停止条件) - 这是一个实验结果表:

Experiment data

以对数缩放图形绘制数字显示:

Experiment graph result

如您所见,图表不是线性的。

我的问题是为什么?

我希望分配在整个范围内表现出线性。

1 个答案:

答案 0 :(得分:1)

x y 线性关系的形式为 y = a + bx 。这是 y vs x 图中的直线,但不是 log(y) vs log(x)< / em> plot,除非常量 a = 0 。所以,我猜想你的关系可能仍然(几乎)线性与 a~340 kB。