【发布时间】:2014-04-12 02:48:36
【问题描述】:
假设我有一个带有大约四个布尔标志的通用函数:
int do_something(int arg, bool flag1, bool flag2, bool flag3, bool flag4) {
for(int i = 0; i < 1000000; i++) {
if(flag1)
// Do something 1
if(flag2)
// Do something 2
if(flag3)
// Do something 3
if(flag4)
// Do something 4
//Do something else 5
}
}
但我不想在内部循环中对这些标志进行分支产生任何成本,因此我将它们更改为模板(允许编译器优化条件):
template<bool flag1, bool flag2, bool flag3, bool flag4>
int do_something_helper(int arg) {
for(int i = 0; i < 1000000; i++) {
if(flag1)
// Do something 1
if(flag2)
// Do something 2
if(flag3)
// Do something 3
if(flag4)
// Do something 4
//Do something else 5
}
}
我现在如何编写 do_something 方法?我知道的唯一方法如下:
int do_something(int arg, bool flag1, bool flag2, bool flag3, bool flag4) {
if(flag1) {
if(flag2) {
if(flag3) {
if(flag4) {
return do_something_helper<true,true,true,true>(arg);
}else{
return do_something_helper<true,true,true,false>(arg);
}
}else{
if(flag4) {
return do_something_helper<true,true,false,true>(arg);
}else{
return do_something_helper<true,true,false,false>(arg);
}
}
//... You get the picture
}
有没有办法让编译器自动编写上面的代码,这样我就不必在我漂亮的代码库中包含这个丑陋的怪物了?
【问题讨论】:
-
在第三块,你不是在分支吗?有什么意义?
-
那些if语句可以用“and”操作符
if (flag1 && flag2 && flag3 && flag 4).. -
不同的是分支在内部循环之外,所以效率更高
-
@CantChooseUsernames 抱歉,这些都是不同的,而不是相同的。我修复了它以澄清
-
“允许编译器优化掉条件”——这在原始版本中也已被允许。您是否验证过编译器无法进行这种优化,并且这种优化的好处是可以衡量的?
标签: c++ templates optimization dry