c – 将可变数量的参数相乘

前端之家收集整理的这篇文章主要介绍了c – 将可变数量的参数相乘前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个可变数量的参数,我想将它们相乘.我想到的第一种方法是递归算法:
template<typename Head>
u64 Multiply(Head head) const
{
    return head;
}

template<typename Head,typename... Tail>
u64 Multiply(Head head,Tail... tail) const
{
    return head * Multiply(tail...);
}

但后来我看到了这个伎俩:

// u32 and u64 are 32 and 64 bit unsigned integers.
template<typename... T>
u64 Multiply(T... args)
{
    u64 res = 1;
    for (const u32& arg: {args...})
        res *= arg;
    return res;
}

第二个似乎对我更好.更容易阅读.但是,这如何影响性能呢?有什么东西被复制了? {args …}首先做了什么?有更好的方法吗?

我可以访问C 14.

编辑要清楚:它是关于运行时乘法,而不是编译时间.

更清楚:我不想有必要计算整数(虽然这是我当前的应用程序),但我发现的算法专门用于整数.

更多:参数属于同一类型.没有这种限制的算法会非常有趣,但也许是针对不同的问题.

解决方法

这里有几个问题:

>对性能有何影响?不知道.你需要衡量.根据参数的类型,我可以想象编译器完全以任何一种方式优化事物:它确实知道参数的数量和类型.>什么是{args …}?好吧,它创建了一个std :: initializer_list< T>对于常见类型的参数(假设有一个).您可能希望将该值与std :: common_type_t< T ...>一起使用.但是,而不是固定类型.>有更好的方法吗?有几种方法,虽然我可以想象编译器实际上对这种扩展做得很好.立即想到的另一种选择是返回(args * … * 1);但是,它需要C 17.如果至少有一个参数,则可以省略* 1:如果存在可变参数的空列表,则可以避免编译时错误.

猜你在找的C&C++相关文章