Если я пишу
enum chars = digits ~ uppercase;
будет ли строка конкатенирована во время компиляции? Я предполагаю, что так будет. Если я заменю его строковым литералом или функцией CTFE, я не могу измерить существенные различия в производительности (даже называя это сто миллионов раз). Я получаю разницу, если я заменю enum на const. Мне сказали, что это неэффективно, чтобы написать это так. Я думал, что это было удобно, и я не вижу неэффективности. (BTW, строка находится в функции, которая называется рекурсивно).
Полный код (преобразование в цифровую систему с другой базой)
import std.string;
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
static string sign;
if (n < 0) {
n *= -1;
sign = "-";
}
enum chars = digits ~ uppercase;
size_t r = cast(size_t)(n % b);
if (n == r) {
return sign ~ chars[r];
}
return toBase((n - r) / b, b) ~ chars[r];
}
Изменить: обновленный код в ответ на комментарии, не относящиеся к вопросу
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
enum chars = digits ~ uppercase;
long r = n % b;
char c = chars[cast(size_t) abs(r)];
if (n == r) {
return (n < 0 ? "-" : "") ~ c;
}
return toBase((n - r) / b, b) ~ c;
}