Tri*_*tan 4 c++ performance templates design-patterns virtual-functions
出于性能原因,我使用Curiously Reoccuring模板模式来避免虚函数.我有很多执行数百万次的小命令.我试图将其纳入命令模式.我想在队列中添加大量命令,然后迭代执行每个命令.每个命令使用CRTP来避免虚函数.我遇到的问题是Command模式通常使用指针向量来实现.但是当Command类被模板化时,很难传递通用的Command指针.我不是C++专家,所以也许有一种显而易见的方法来存储模板化命令对象的向量?我一直试图使用类似的东西:
boost:ptr_vector commands;
AddCommand(Command* command) {
commands.push_back(command);
}
Run Code Online (Sandbox Code Playgroud)
问题是Command不是类型,因此Command* command给出了编译错误.我需要使用Command<CommandType>,但这不起作用,因为我需要队列来保存不同类型的命令.
任何解决方案的想法?或者虚拟功能是我唯一的选择吗?
增加:命令对象是蒙特卡罗模拟算法的一部分.所以你可能有,Command是来自正态分布的随机数,其中正态分布的参数是类的一部分.所以命令模式非常合适.我按特定顺序对需要维护状态的函数进行了大量调用.
A. *_*evy 11
CRTP通过在编译时解析对象的运行时类型来实现其魔力,以便编译器可以内联函数调用.如果您有一个指向泛型类型的指针向量,则编译器无法确定具体的具体类型,并且无法执行其编译时解析.
从您在问题中的信息,我认为虚拟功能是您的最佳选择.但是,虚函数并不那么慢.它们比内联功能慢,当然,但在很多情况下它们足够快!特别是如果您的过程受I/O时间限制而不是处理时间.
答案之一到这个问题,有更多一些对这个问题的深入讨论.总而言之,虚拟函数调用的开销可能以纳秒为单位进行测量.它比这更复杂,但关键是你不应该害怕虚函数,除非你的函数做的事情真的像一个单独的赋值.你说你的命令很小,所以也许就是这种情况.我尝试用虚函数做一个快速原型,看看它是否能提供可接受的性能.