使用map容器进行优化可以避免遍历查找的时间复杂度O(n),可以降低到O(logn)。

首先需要修改addr_map_t结构体,使其能够比较大小和作为map的key:

struct addr_map_t
{
    uint32_t old_func;
    uint32_t new_func;
    uint32_t count;
    vector<uint32_t> old_pos_v;
    vector<uint32_t> new_pos_v;

    bool operator<(const addr_map_t& other) const
    {
        return old_func < other.old_func || (old_func == other.old_func && new_func < other.new_func);
    }
};

然后使用map容器来存储addr_map_t对象,将old_func和new_func作为key:

std::map<addr_map_t, int> m_map_normal_func_addr;

修改save_normal_func函数:

int save_normal_func(uint32_t func0, uint32_t func1, uint32_t pos0, uint32_t pos1)
{
    addr_map_t st;
    st.old_func = func0;
    st.new_func = func1;

    auto it = m_map_normal_func_addr.find(st);
    if (it != m_map_normal_func_addr.end())
    {
        it->second++;
        it->first.old_pos_v.push_back(pos0);
        it->first.new_pos_v.push_back(pos1);
        return 0;
    }

    st.count = 1;
    st.old_pos_v.push_back(pos0);
    st.new_pos_v.push_back(pos1);
    m_map_normal_func_addr[st] = 1;

    return 1;
}

这样就可以使用map容器来优化查找和插入操作了

C++ 使用map或者set容器进行优化:typedef struct uint32_t old_func; 这里包含基准地址 uint32_t new_func; uint32_t count; vectoruint32_t old_pos_v; 此处不包含基准地址 vectoruint32_t new_pos_v; 此处

原文地址: https://www.cveoy.top/t/topic/iROx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录