Вы сделали простую ошибку в коде:
str.replace ("я", "а");
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
индексирование и итерации не требуют никаких новых (конечно). Верьте или нет, но даже добавление иногда не выделяется, потому что в конце среза может остаться память (хотя это обычно будет).
Существуют также различные функции, которые возвращают объекты диапазона, которые выполняют изменения по мере прохождения через них, избегая выделения. Например, вместо replace(a, "f", "");
вы можете сделать что-то вроде filter!(ch => ch != 'f')(a);
и пропустить цикл, который не выделяет новую строку, если вы ее не попросите.
Так что это намного больше нюансов, чем вы думаете!
какая разница между 'string * str_ptr; str_ptr = &str; writeln (str_ptr); 'и' writeln (str.ptr); ' –
' & str' является указателем на ARRAY, 'str.ptr' является указателем на СОДЕРЖАНИЕ. –