Qt - std::unordered_map - 销毁时间

Posted

技术标签:

【中文标题】Qt - std::unordered_map - 销毁时间【英文标题】:Qt - std::unordered_map - destruction time 【发布时间】:2015-12-11 09:49:06 【问题描述】:

我有一个带有单例的类和一个成员 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()

main函数只需要一行sWorker.Fill();

【问题讨论】:

你指的是Qt Creator吗?您是在使用带有 Qt Creator 的 MSVC 编译器,还是在使用其他编译器? @MarkoPopovic 是的,我正在将 MSVC 与 Qt Creator 一起使用。 如果您使用发布配置构建也会发生同样的情况吗? 【参考方案1】:

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

我已将此添加到 Qt creator 中的 .pro 文件中。

DEFINES += _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH
DEFINES += _HAS_ITERATOR_DEBUGGING=0

注意:在调试模式下对性能稍有好处,对安全检查不利。对我来说没问题。

【讨论】:

以上是关于Qt - std::unordered_map - 销毁时间的主要内容,如果未能解决你的问题,请参考以下文章

两个 std::unordered_map 的交集

std::hash 特化仍未被 std::unordered_map 使用

为啥我不能增加 std::unordered_map 迭代器?

在 std::map 和 std::unordered_map 之间进行选择 [重复]

如何在 std::tuple 中合并 std::unordered_map?

std::unordered_map::operator[] - 为啥有两个签名?