将两个参数之一作为 constexpr 的内联函数
Inline function with one of two parameters as constexpr
假设我有一个带有两个参数的函数,其中第一个参数是动态的,但第二个参数始终是编译时已知的常量:
uint8_t convert_bcd(uint8_t num, uint8_t mask) {
uint8_t result = mask & 0x0F & num;
if constexpr ((mask & 0xF0) != 0) // mask is known at compile time, can be optimized
result += 10 * ((mask & 0xF0 & num) >> 4);
return result;
}
用法示例
uint8_t result1 = convert_bcd(data[0], 0x7F);
uint8_t result2 = convert_bcd(data[1], 0x3F);
我想内联这个函数(如果可能的话)并告诉编译器可以在编译时解决 if 条件,它只涉及始终为常量的第二个参数。
我对inline
/const
/constexpr
以及如何在我的场景中应用它们以尽可能优化功能感到困惑。
在 C++ 中正确的惯用方法是什么?
编写模板。
template<uint8_t mask>
uint8_t convert_bcd(uint8_t num) {
uint8_t result = mask & 0x0F & num;
if constexpr ((mask & 0xF0) != 0)
result += 10 * ((mask & 0xF0 & num) >> 4);
return result;
}
uint8_t result1 = convert_bcd<0x7F>(data[0]);
uint8_t result2 = convert_bcd<0x3F>(data[1]);
假设我有一个带有两个参数的函数,其中第一个参数是动态的,但第二个参数始终是编译时已知的常量:
uint8_t convert_bcd(uint8_t num, uint8_t mask) {
uint8_t result = mask & 0x0F & num;
if constexpr ((mask & 0xF0) != 0) // mask is known at compile time, can be optimized
result += 10 * ((mask & 0xF0 & num) >> 4);
return result;
}
用法示例
uint8_t result1 = convert_bcd(data[0], 0x7F);
uint8_t result2 = convert_bcd(data[1], 0x3F);
我想内联这个函数(如果可能的话)并告诉编译器可以在编译时解决 if 条件,它只涉及始终为常量的第二个参数。
我对inline
/const
/constexpr
以及如何在我的场景中应用它们以尽可能优化功能感到困惑。
在 C++ 中正确的惯用方法是什么?
编写模板。
template<uint8_t mask>
uint8_t convert_bcd(uint8_t num) {
uint8_t result = mask & 0x0F & num;
if constexpr ((mask & 0xF0) != 0)
result += 10 * ((mask & 0xF0 & num) >> 4);
return result;
}
uint8_t result1 = convert_bcd<0x7F>(data[0]);
uint8_t result2 = convert_bcd<0x3F>(data[1]);