使用非类型模板参数的 C++ 优化
C++ optimization with a Non-Type Template Parameter
我不确定在这种情况下位是非类型模板是否有意义:
template< int bits >
inline bool FitsInBits(int x )
{
#if bits >= 32
#error 'bits' should be less than 32
#endif
return x >= -((int)1<<(bits-1)) && x < ((int)1<<(bits-1));
}
然后:
inline bool FitsInBits(int x, int bits )
{
return x >= -((int)1<<(bits-1)) && x < ((int)1<<(bits-1));
}
据我了解,编译器会在编译时在第一种情况下创建许多 FitsInBits 变体?但是我看不出这将如何优化计算。
模板不一定更高效,但它向您保证:-((int)1<<(bits-1))
和((int)1<<(bits-1))
的值可以在编译时计算,所以在 运行 时间发生的所有事情基本上是:
return x >= constant_a && x < constant_b;
反过来,这非常微不足道,编译器 can/will 很有可能为其生成内联代码。
假设 bits
是一个在编译时已知的值,非模板版本可以(并且可能会)做同样的事情——但是因为 bits
是普通参数的普通参数函数,您 可以 (可能是不小心)为 bits
传递一些直到 运行 时间才知道的值(例如,基于用户输入的数据) .
如果您这样做,编译器就不会t/won就您这样做发出警告——在这种情况下,表达式可能不会 像上面一样减少为常量,所以你很可能最终得到的代码是将 1
加载到一个寄存器中,将 bits
加载到另一个寄存器中,将第二个递减,将第一个向左移动在第二个指定的地方,与 x
比较,有条件地跳转到一个标签,取反第一个,再次比较,再做一个条件跳转,等等。这仍然只有十几个指令(左右),但无疑更慢比值是常量时。
我不确定在这种情况下位是非类型模板是否有意义:
template< int bits >
inline bool FitsInBits(int x )
{
#if bits >= 32
#error 'bits' should be less than 32
#endif
return x >= -((int)1<<(bits-1)) && x < ((int)1<<(bits-1));
}
然后:
inline bool FitsInBits(int x, int bits )
{
return x >= -((int)1<<(bits-1)) && x < ((int)1<<(bits-1));
}
据我了解,编译器会在编译时在第一种情况下创建许多 FitsInBits 变体?但是我看不出这将如何优化计算。
模板不一定更高效,但它向您保证:-((int)1<<(bits-1))
和((int)1<<(bits-1))
的值可以在编译时计算,所以在 运行 时间发生的所有事情基本上是:
return x >= constant_a && x < constant_b;
反过来,这非常微不足道,编译器 can/will 很有可能为其生成内联代码。
假设 bits
是一个在编译时已知的值,非模板版本可以(并且可能会)做同样的事情——但是因为 bits
是普通参数的普通参数函数,您 可以 (可能是不小心)为 bits
传递一些直到 运行 时间才知道的值(例如,基于用户输入的数据) .
如果您这样做,编译器就不会t/won就您这样做发出警告——在这种情况下,表达式可能不会 像上面一样减少为常量,所以你很可能最终得到的代码是将 1
加载到一个寄存器中,将 bits
加载到另一个寄存器中,将第二个递减,将第一个向左移动在第二个指定的地方,与 x
比较,有条件地跳转到一个标签,取反第一个,再次比较,再做一个条件跳转,等等。这仍然只有十几个指令(左右),但无疑更慢比值是常量时。