【发布时间】:2021-12-27 11:14:10
【问题描述】:
考虑以下两个sn-ps:
// Option (1).
boost::mp11::mp_with_index<N>(i,
[&](const auto i){ function<i>(/* args... */); });
和
// Option (2).
inline static const std::array<std::function<void(/* Args... */)>, N>
functionArray{function<0>, ..., function<N-1>};
functionArray[i](/* args... */);
其中N 是大约在[0, 20] 范围内的编译时间大小,i 是0 和N-1 之间的运行时索引,template <size_t I> function(/* Args... */) 是具有已知签名的模板函数. 这两个选项中哪一个是最快的?
注意:我知道boost::mp11::mp_with_index 基本上创建了一个 switch 语句,允许将运行时索引转换为编译时索引。这引入了一些间接性,但我希望这不会太昂贵。同样,我知道std::function 由于类型擦除而引入了一些间接性。我的问题是:这两种间接方式中哪一种最有效?
【问题讨论】:
-
了解的唯一方法是在实际代码中测量它。您的代码示例中的
std::function在哪里? -
@Evg 感谢您指出,我刚刚编辑了我的问题!我想知道
std::function实现的那种间接性是否与boost::mp11::mp_with_index提供的一样有效。对我来说,这看起来几乎不可能,因为std::function不知道N,所以它不能创建一个带有签名void(/* Args... */)的所有可能实现的编译时间表。有谁知道std::function在后台是如何工作的?
标签: c++ boost callback benchmarking std-function