"使用STL容器优化后的代码如下:\n\nstd\u003a\u003aunordered_map\u003cuint64_t, addr_map_t\u003e m_map_normal_func_addr; /使用unordered_map代替vector保存正常匹配的所有地址映射/\nstd\u003a\u003aunordered_map\u003cuint32_t, addr_map_t\u003e m_map_invalid_func_addr; /使用unordered_map代替vector保存无效的跳转信息/\n\nint save_normal_func(uint32_t func0, uint32_t func1, uint32_t pos0, uint32_t pos1)\n{\n uint64_t key = (static_cast\u003cuint64_t\u003e(func0) \u003c\u003c 32) | func1;\n auto it = m_map_normal_func_addr.find(key);\n if (it != m_map_normal_func_addr.end())\n {\n it->second.count++;\n it->second.old_pos_v.push_back(pos0);\n it->second.new_pos_v.push_back(pos1);\n return 0;\n }\n\n addr_map_t st;\n st.count = 1;\n st.old_func = func0;\n st.new_func = func1;\n st.old_pos_v.push_back(pos0);\n st.new_pos_v.push_back(pos1);\n m_map_normal_func_addr[key] = st;\n\n return 1;\n}\n\nint save_invalid_func(uint32_t func0, uint32_t pos0, uint32_t pos1)\n{\n auto it = m_map_invalid_func_addr.find(func0);\n if (it != m_map_invalid_func_addr.end())\n {\n it->second.count++;\n it->second.old_pos_v.push_back(pos0);\n it->second.new_pos_v.push_back(pos1);\n return 0;\n }\n\n addr_map_t st;\n st.count = 1;\n st.old_func = func0;\n st.old_pos_v.push_back(pos0);\n st.new_pos_v.push_back(pos1);\n m_map_invalid_func_addr[func0] = st;\n\n return 1;\n}\n\n这里使用了unordered_map来代替vector保存地址映射信息。通过将func0和func1合并为一个64位的key,然后将对应的addr_map_t保存在unordered_map中,可以大大提高查找的效率。同时,使用unordered_map的插入操作和查找操作的平均时间复杂度为O(1),相比于vector的O(n),可以减少不必要的遍历。\n\n"

C++ STL 容器优化:使用 unordered_map 提升函数地址映射效率

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

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