使用 STL 容器可以优化这两个函数的时间复杂度。可以使用 unordered_map 来替代 vector,使用 unordered_map 可以实现常数时间的查找和插入操作。

首先,将 m_vec_normal_func_addr 和 m_vec_invalid_func_addr 定义为 unordered_map 类型:

std::unordered_map<uint64_t, addr_map_t> m_map_normal_func_addr; /*保存正常匹配的所有地址映射*/
std::unordered_map<uint32_t, addr_map_t> m_map_invalid_func_addr; /*保存无效的跳转信息*/

接下来,修改 save_normal_func 函数:

int save_normal_func(uint32_t func0, uint32_t func1, uint32_t pos0, uint32_t pos1)
{
    uint64_t key = (static_cast<uint64_t>(func0) << 32) | func1;
    auto it = m_map_normal_func_addr.find(key);
    if (it != m_map_normal_func_addr.end())
    {
        it->second.count++;
        it->second.old_pos_v.push_back(pos0);
        it->second.new_pos_v.push_back(pos1);
        return 0;
    }

    addr_map_t st;
    st.count = 1;
    st.old_func = func0;
    st.new_func = func1;
    st.old_pos_v.push_back(pos0);
    st.new_pos_v.push_back(pos1);
    m_map_normal_func_addr[key] = st;

    return 1;
}

最后,修改 save_invalid_func 函数:

int save_invalid_func(uint32_t func0, uint32_t pos0, uint32_t pos1)
{
    auto it = m_map_invalid_func_addr.find(func0);
    if (it != m_map_invalid_func_addr.end())
    {
        it->second.count++;
        it->second.old_pos_v.push_back(pos0);
        it->second.new_pos_v.push_back(pos1);
        return 0;
    }

    addr_map_t st;
    st.count = 1;
    st.old_func = func0;
    st.old_pos_v.push_back(pos0);
    st.new_pos_v.push_back(pos1);
    m_map_invalid_func_addr[func0] = st;

    return 1;
}

通过使用 unordered_map,可以将查找和插入操作的时间复杂度从线性降低为常数,从而优化了函数的性能。

C++ STL 容器优化:使用 unordered_map 提升函数性能

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

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