使用C++中的STL容器可以优化上述函数的时间复杂度。可以使用一个map来存储无效的跳转信息,其中键为old_func,值为addr_map_t结构体。

具体优化步骤如下:

  1. 将m_vec_invalid_func_addr更改为std::map<uint32_t, addr_map_t> m_invalid_func_addr。
  2. 将for循环替换为对m_invalid_func_addr进行查找。
  3. 如果找到了对应的old_func,更新count、old_pos_v和new_pos_v。
  4. 如果未找到对应的old_func,创建一个新的addr_map_t结构体并插入到m_invalid_func_addr中。

优化后的代码如下所示:

typedef struct { uint32_t old_func; /这里包含基准地址/ uint32_t new_func; uint32_t count; vector<uint32_t> old_pos_v; /此处不包含基准地址/ vector<uint32_t> new_pos_v; /此处不包含基准地址/ } addr_map_t;

std::map<uint32_t, addr_map_t> m_invalid_func_addr; /保存无效的跳转信息/

int save_invalid_func(uint32_t func0, uint32_t pos0, uint32_t pos1) { auto it = m_invalid_func_addr.find(func0); if (it != m_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_invalid_func_addr.insert(std::make_pair(func0, st));

return 1;

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

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