我有一个 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 file and add Child instances to v based on the file contents
while (true) {
// do other stuff
for (size_t i = 0; i != v.size(); ++i) {
v[i]->f(); // expensive to do the same virtual table lookups every loop!
}
}
};