如果我寫編譯時間評估
enum chars = digits ~ uppercase;
將字符串在編譯時串連?我假設它會。如果我用字符串文字或CTFE函數替換它,我無法測量任何顯着的性能差異(甚至稱它爲一億次)。如果我用const替換枚舉,我確實有區別。我被告知這樣寫是沒有效率的。我認爲這樣很方便,我沒有看到效率低下。 (順便說一下,該行是在遞歸調用的函數中)。
的完整代碼(轉換爲數字系統具有不同的基本)
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;
}
您忘記了重置符號字符串(您可以使用'scope(exit)sign =「」;'),所以'toBase(-10,10)'後跟'toBase(10,10)'會給相同的結果 –
沒錯。哈哈哈,我第一次使用靜態變量。棘手。這個範圍(退出)的東西真的很有用,不是嗎?遞歸調用不符合範圍退出條件,我感到有點驚訝。 – fwend
作用域(退出)在當前堆棧框被彈出堆棧時執行(如try ... finally真的但沒有額外的縮進)遞歸不會這樣做 –