バリアントはstring
遅くなります:
std::stringstream ss; // allocation, initialization ...
ss << 4711; // parsing, setting internal flags, ...
std::string str = ss.str(); // allocations, array copies ...
// cleaning up (compiler does it for you) ...
str.~string();
ss.~stringstream(); // destruction ...
より多くの...
ことが起こっていることを示します。
コンパクトな(キャッシュに適した)ループ(分岐予測に適した)が必要な場合があります。
int num_digits (int value, int base=10) {
int num = 0;
while (value) {
value /= base;
++num;
}
return num;
}
int num_zeros (int value, int base=10) {
return num_decimal_digits(value, base) - 1;
}
状況によっては、キャッシュと予測に適しているため、関係演算子に基づくソリューションよりも高速になる場合があります。
テンプレート化されたバリアントを使用すると、コンパイラは部門に対していくつかのマイクロ最適化を実行できます。
template <int base=10>
int num_digits (int value) {
int num = 0;
while (value) {
value /= base;
++num;
}
return num;
}