你在你的代碼做了一個簡單的錯誤:
str.replace( 「我」, 「A」);
str.replace
回報新的字符串做替換,它實際上並沒有取代現有的變量。因此請嘗試str = str.replace("i", "a");
以查看更改。
但你還就分配一個過於寬泛籠統的說法:所以對字符串處理的每個操作的內存分配
。
這是錯誤的,很多操作不需要分配新的內存。可以切片現有字符串任何事情都會這麼做,避免了需要新的內存:
import std.string;
import std.stdio;
void main() {
string a = " foo ";
string b = a.strip();
assert(b == "foo"); // whitespace stripped off...
writeln(a.ptr);
writeln(b.ptr); // but notice how close those ptrs are
assert(b.ptr == a.ptr + 2); // yes, b is a slice of a
}
replace
也將返回如果沒有更換,實際上完成了原始字符串:
string a = " foo ";
string b = a.replace("p", "a"); // there is no p to replace
assert(a.ptr is b.ptr); // so same string returned
索引和迭代不需要新分配(當然)。相信與否,但即使追加有時也不會分配,因爲可能在片的末尾留下了尚未使用的內存(雖然通常會)。
還有各種函數會返回範圍對象,這些對象在您遍歷它們時執行更改,從而避免分配。例如,您可以使用filter!(ch => ch != 'f')(a);
之類的代替replace(a, "f", "");
的循環,除非您提出要求,否則不會分配新的字符串。
所以它比你想象的要多得多!
'string * str_ptr; str_ptr = &str; writeln(str_ptr);''''和'writeln(str.ptr);' –
'&str'是指向ARRAY的指針,'str.ptr'是指向CONTENTS的指針。 –