我想重构以下代码:
enum Mode { None, Value1, Value2 }
template <Mode mode>
bool func() {
if (mode == None) {
helperNone();
return funcImplNone();
} else if (mode == Value1) {
helper1();
return funcImplValue1();
} else if (mode == Value2) {
helper2();
return funcImplValue2();
}
return true;
}
因为表达式
mode == None
是在编译期间计算的。难道他的代码不会导致代码膨胀(可执行文件中的代码重复)吗?
我正在考虑以下重构:
template<Mode>
bool func() {
return true;
}
template<>
bool func<None>() {
return true;
}
template<>
bool func<Value1>() {
helper1();
return funcImplValue2();
}
template<>
bool func<Value2>() {
helper2();
return funcImplValue2();
}
还有其他标准方法可以重构吗? 我们是否可以保证编译器将优化该代码本身? 重构的代码看起来更清晰吗?
答案 0 :(得分:1)
这里的重构毫无意义,因为无论如何它都在进行优化。 例如,以下代码仅对funcImpl()产生一个调用;
enum Mode { None, Other };
bool funcImpl();
template <Mode mode>
bool func() {
if (mode != None)
return funcImpl();
return true;
}
void test()
{
volatile auto a = func<None>();
a = func<Other>();
}
结果是
test():
sub rsp, 24
mov BYTE PTR [rsp+15], 1
call funcImpl()
mov BYTE PTR [rsp+15], al
add rsp, 24
ret