c – 使用模板函数生成的代码与普通函数之间的差异
发布时间:2020-12-16 10:51:57 所属栏目:百科 来源:网络整理
导读:我有一个包含大量元素的向量.现在我想编写一个小函数来计算向量中偶数或奇数元素的数量.由于性能是一个主要问题,我不想在循环中放入if语句.所以我写了两个小函数,如: long long countOdd(const std::vectorint v){ long long count = 0; const int size = v
我有一个包含大量元素的向量.现在我想编写一个小函数来计算向量中偶数或奇数元素的数量.由于性能是一个主要问题,我不想在循环中放入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. 所以在实践中,不,生成的代码应该没有区别.所以你可以使用模板版本,不用担心这个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |