C++ STL 容器优化:使用 unordered_map 提升函数性能
使用 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,可以将查找和插入操作的时间复杂度从线性降低为常数,从而优化了函数的性能。
原文地址: https://www.cveoy.top/t/topic/qxRn 著作权归作者所有。请勿转载和采集!