gpt4 book ai didi

c++ - 没有虚函数的命令模式(C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:56 25 4
gpt4 key购买 nike

出于性能原因,我使用 Curiously Reoccuring Template Pattern避免虚函数。我有很多执行数百万次的小命令。我正在尝试将其纳入命令模式。我想将大量命令添加到队列中,然后遍历它们逐个执行。每个命令都使用 CRTP 来避免虚拟功能。我遇到的问题是命令模式通常是使用指针 vector 实现的。但是当 Command 类被模板化时,就很难传递通用的 Command 指针。我不是 C++ 专家,所以也许有一种明显的方法来存储模板化命令对象的 vector ?我一直在尝试使用类似的东西:

boost:ptr_vector commands;
AddCommand(Command* command) {
commands.push_back(command);
}

问题是Command不是类型,所以 Command* command给出编译错误。我需要使用 Command<CommandType> ,但这行不通,因为我需要队列来保存不同类型的命令。

有什么解决方案吗?还是虚函数是我唯一的选择?

添加:命令对象是蒙特卡洛模拟算法的一部分。所以你可能有, Command 是来自正态分布的随机数,其中正态分布的参数是类的一部分。所以命令模式非常适合。我有很多调用,按特定顺序调用需要维护状态的函数。

最佳答案

CRTP 通过在编译时解析对象的运行时类型来发挥其魔力,以便编译器可以内联函数调用。如果您有指向泛型类型的指针 vector ,则编译器无法确定具体的具体类型,也无法进行编译时解析。

仅从您问题中的信息来看,我认为虚函数是您的最佳选择。然而,虚函数并没有那么慢。当然,它们比内联函数慢,但在许多情况下它们已经足够快了!特别是当您的进程受 I/O 时间而不是处理时间限制时。

One of the answersthis question对这个问题有一些更深入的讨论。总而言之,虚函数调用的开销可能以纳秒为单位进行测量。它比那更复杂,但关键是你不应该害怕虚函数,除非你的函数正在做一些非常微不足道的事情,比如一个单一的赋值。你说你的命令很小,所以也许是这样。我会尝试用虚函数做一个快速原型(prototype),看看是否能提供可接受的性能。

关于c++ - 没有虚函数的命令模式(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/978739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com