Qt - std :: unordered_map - 销毁时间

时间:2015-12-11 09:49:06

标签: c++ qt c++11 visual-studio-2015 unordered-map

我有一个包含单身人士和成员std::unordered_map的班级,其中unsigned int 为关键为结构为值。

向其中添加大量元素时,会出现问题 在 VS 中,此任务需要 2秒。 QT 中,最多需要15秒。

容器元素的

销毁(程序结束或单例类的析构函数)接收 VS甚至不到半秒。 QT 此任务需要几分钟。

如果有人知道问题可能是什么,请留下答案或评论。

注意:在运行时可以调用函数Fill几次。如果你必须等待几分钟才能清理一个容器,那就太好了......大多数时候,它似乎花在了_Iterator_base12::_Orphan_me

之内

这里要重现的类/代码(没有main):

#include <unordered_map>

int RandomNumber(int min, int max)
{
    return (rand() % ((max + 1) - (min))) + (min);
}

#define MAX_OTHER_DATA 5

struct OtherData
{
    int Charges;
};

struct DataHolder
{
    unsigned int ID;
    std::string Name; //std::string / QString
    int MaxCount;
    int Stack;
    unsigned int Duration;
    OtherData other[MAX_OTHER_DATA];
    unsigned int MaxDur;
};

class Worker
{
protected:
    Worker() {}
public:
    ~Worker(void)
    {
        v.clear();
    }

    static Worker &instance(void)
    {
        static Worker work;
        return work;
    }

    void Fill()
    {
        v.clear();
        const std::size_t size = 38618; //current size - data fetched from a database
        for (unsigned int i = 0U; i < size; ++i)
        {
            DataHolder it;
            it.ID = RandomNumber(1, 60000);
            it.Name = ""; //Usually populated
            it.MaxCount = RandomNumber(0, 10);
            it.Stack = RandomNumber(1, 10000);
            it.Duration = RandomNumber(30, 250);
            it.MaxDur = RandomNumber(0, 200);
            v.insert(std::make_pair(i, it));
        }
    }
private:
    std::unordered_map<unsigned int, DataHolder> v;
};
#define sWorker Worker::instance()

主要功能只需要一行sWorker.Fill();

1 个答案:

答案 0 :(得分:2)

因此,在将更多时间投入到谷歌和一些网站后,我发现了这一点,这解决了在调试模式下编译时的问题。 (发布很好)

我已将此添加到Qt创建者的.pro文件中。

DEFINES += _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
DEFINES += _HAS_ITERATOR_DEBUGGING=0

注意:适用于调试模式下的一点性能,不利于安全检查。对我来说没关系。