C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用模板函数生成的代码与普通函数之间的差异大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包含大量元素的向量.现在我想编写一个函数来计算向量中偶数或奇数元素的数量.由于性能一个主要问题,我不想在循环中放入if语句.所以我写了两个小函数,如:

long long countOdd(const std::vector<int>& v)
{
    long long count = 0;
    const int size = v.size();
    for(int i = 0; i < size; ++i)
    {
        if(v[i] & 1)
        {
            ++count;
        }
    }
    return count;
}

long long countEven(const std::vector<int>& v)
{
    long long count = 0;
    const int size = v.size();
    for(int i = 0; i < size; ++i)
    {
         if(0 == (v[i] & 1))
        {
            ++count;
        }
    }
    return count;
}

我的问题是我可以通过编写这样的单个模板函数来获得相同的结果:

template <bool countEven>
long long countTemplate(const std::vector<int>& v1)
{
    long long count = 0;
    const int size = v1.size();
    for(int i = 0; i < size; ++i)
    {
        if(countEven)
        {
            if(v1[i] & 1)
            {
                ++count;
            }
        }
        else if(0 == (v1[i] & 1))
        {
            ++count;
        }
    }
    return count;
}

并使用它像这样:

int main()
{
  if(somecondition)
  {
     countTemplate<true>(vec); //Count even
  }      
  else
  {
     countTemplate<false>(vec); //Count odd
  } 
}

为模板和非模板版本生成代码是否相同?还是会发出一些额外的指示?

请注意,数字的计数仅用于说明,因此请不要建议其他计数方法.

编辑:
好.我同意从性能的角度来看它可能没什么意义.但至少从可维护性的角度来看,我希望只有一个函数来维护而不是两个.

解决方法

您的模板版本将生成如下代码

template <>
long long countTemplate<true>(const std::vector<int>& v1)
{
    long long count = 0;
    const int size = v1.size();
    for(int i = 0; i < size; ++i)
    {
        if(true)
        {
                if(v1[i] & 1)
                {
                        ++count;
                }
        }
        else if(0 == (v1[i] & 1))
        {
                ++count;
        }
    }
    return count;
}


template <>
long long countTemplate<false>(const std::vector<int>& v1)
{
    long long count = 0;
    const int size = v1.size();
    for(int i = 0; i < size; ++i)
    {
        if(false)
        {
                if(v1[i] & 1)
                {
                        ++count;
                }
        }
        else if(0 == (v1[i] & 1))
        {
                ++count;
        }
    }
    return count;
}

因此,如果禁用所有优化,理论上if仍然存在.但即使是一个非常天真的编译器也会确定你正在测试一个常量,并简单地删除if.

所以在实践中,不,生成代码应该没有区别.所以你可以使用模板版本,不用担心这个.

大佬总结

以上是大佬教程为你收集整理的c – 使用模板函数生成的代码与普通函数之间的差异全部内容,希望文章能够帮你解决c – 使用模板函数生成的代码与普通函数之间的差异所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: