我有 C++ 程序,它在执行二进制文件时读取配置文件,根据配置文件创建许多子类实例,然后定期迭代这些实例并调用它们各自的虚拟函数。
Gprof 告诉我这些函数调用占用了很多时间(前面提到的迭代发生得非常频繁),所以我想以某种方式尽量避免重复的虚函数调用。
代码类似于以下内容。一旦程序在程序开始时填充向量 v,该向量在程序的其余部分将不再改变,因此每次我想调用 f() 时重复执行虚拟表查找似乎效率低下。我认为必须有一种方法可以以某种方式缓存或保存函数指针,但我不确定如何。
希望您有任何关于加快速度的建议。谢谢!
编辑:对不起,我忘了提到函数调用 f() 的子实例向量必须按照从 0 到 v.size() - 1 的顺序,所以我不能将 v 的元素组合在一起相同的派生类型。
此外,这是用 -O3 -std=c++14 构建的
class Parent {
public:
virtual void f() { }
};
class Child1 : public Parent {
public:
void f() { /* do stuff for child1 */ }
};
//...
class Child9 : public Parent {
public:
void f() { /* do stuff for child9 */ }
};
int main() {
vector<Parent*> v;
// read config …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用提示插入到 a 中boost::flat_map,但明显的语法无法编译,即使当我使用提示将std::map. 我错过了一些明显的东西吗?
#include <boost/container/flat_map.hpp>
#include <map>
int main() {
std::map<int, int> map;
map.emplace_hint(map.begin(), 0, 0); // compiles fine
boost::container::flat_map<int, int> flat_map;
flat_map.insert_or_assign(flat_map.begin(), 0, 0); // does not compile fine
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误是:
g++ -I. -I../boost_1_65_1 -Wall -O3 -Wsign-compare -Wno-strict-aliasing -Wno-parentheses -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free -std=c++14 -g -ggdb -c -o main.o main.cpp
In file included from main.cpp:1:0:
../boost_1_65_1/boost/container/flat_map.hpp: In instantiation of ‘boost::container::flat_map<Key, T, Compare, Allocator>::iterator boost::container::flat_map<Key, T, Compare, Allocator>::insert_or_assign(boost::container::flat_map<Key, T, Compare, Allocator>::const_iterator, boost::container::flat_map<Key, T, …Run Code Online (Sandbox Code Playgroud)