You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化虚函数调用性能:解决循环中Animal::f1(int)调用瓶颈

虚函数调用性能优化问题

问题背景

需要优化虚函数Animal::f1(int)的调用性能(非过早优化)。Animal::f1(int)是纯虚函数,由Dog、Cat、Murderous_Hippo等多个派生类实现。实际场景中f1()作为高CPU负载的回调函数,始终通过基类指针调用(如animal->f1(something)),而非派生类直接调用。

性能分析显示,频繁调用animal->f1(int)仅在如下嵌套循环场景中成为性能瓶颈:

for(Animal* animal : allAnimalInTheWorld){
    for(int i : intArraySizeAround1000){
        animal->f1(i);
    }
}

已尝试的解决方案

方案1:批量调用封装(速度快但维护成本高)

将回调逻辑封装为接收数组的函数,通过std::function实现批量调用。调用animal->f2(vector_of_int)可提升性能,但每个派生类必须手动调用regg<T>(),维护难度大。伪代码如下:

class Animal{
    public: virtual void f1(int)=0;
    public: std::function<void(const std::vector<int>& v)> f2;
    public: template<class T> void regg(){  
        f2=[&](const std::vector<int>& v){   ///<=== 以数组作为参数传递
            for(auto i:v){
                 static_cast<T*>(this)->f1(i);   ///<=== 性能提升显著
            }
        };
    };
};
class Dog final : Animal{
    public: Dog(){  Animal::regg<Dog>(); }
};

方案2:deducing this技术(无效)

尝试使用deducing this技术自动注册回调,但由于Animal构造时无法识别自身为Dog实例,方案失效。MCVE示例如下:

#include <iostream>
#include <functional>
class Animal{
    public: virtual void f1(int)=0;
    public: std::function<void(const std::vector<int>& v)> f2;
   
    ///: "deducing this" 技术(此场景下无效)
    public:  template <typename Self> void myReg(this Self&& self)   {
        std::cout<<"Animal::myReg ini self=" 
           <<typeid(decltype(self)).name() <<std::endl;
        self.f2=[&](const std::vector<int>& v){
            for(auto ele:v){
                 self.f1(ele);
            }
        };
    }
    int s=(myReg(),-12);
};

class Dog  final : public Animal{public:
    virtual void f1(int param){
        std::cout<<(param+1)<<std::endl; 
       ///: 一些关于param的快速但复杂的逻辑
    }
};
int main(){
    Dog d;       /// 输出 "self=class Animal",不符合预期
}

需求

寻求一种无需在派生类中添加额外维护代码的方案,解决循环中f1()调用的性能问题。注:CRTP方案虽有效,但维护成本与方案1相近,不考虑。

内容的提问来源于stack exchange,提问作者cppBeginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:11:20