小编gal*_*lpo的帖子

避免重复的 C++ 虚拟表查找

我有 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)

c++ optimization virtual-functions vtable virtual-table

6
推荐指数
1
解决办法
509
查看次数

提示在 boost 和标准库中的表现不同吗?

我正在尝试使用提示插入到 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)

c++ boost

2
推荐指数
1
解决办法
51
查看次数