I want to write a highly optimized code in C and there is a templated structure which takes a type variable T. There is one function wow() in that structure that can be optimized to run twice faster if and only if the size of T is a power of 2. Can I use the better version of wow() without doing branching (use if or something) at the beginning of every call to wow()?
I understand (I hope I do) that C creates a copy (or better say instantiation) of my structure for every type T I use it with, so can I tell that "struct builder" which version of wow() to use depending on the size of T?
CodePudding user response:
I would use constexpr if and std::has_single_bit:
#include <bit>
template<class T>
struct foo {
void wow() {
if constexpr (std::has_single_bit(sizeof(T))) {
// sizeof(T) is a power of two
} else {
// not a power of two
}
}
};
