Здравствуйте, GlebZ, Вы писали:
PD>>Хуже. Она использует __declspec(thread). Иначе, сам подумай, что будет, если ее начнут из разных потоков вызывать
GZ>Для этого достаточно одного потока.
Только при некорректном использовании.
GZ>Честно говоря, аналогом можно считать больше wstring чем char*. Char* — это область памяти с которой можно сильно сглюкавить
или сделать что-то очень эффективно. Вообще возможность сделать что-то эффективно всегда связана с большей возможностью сглюкавить. Крайний пример такого утверждения — ассемблер.
GZ>GZ>if (bla-bla)
GZ> strupr(lpStr);
GZ>
Да. Классический вариант inplace обработки.
GZ>То есть, не обязательно строка будет изменена. А защищать ее как-то уже надо. В Net над таким задумываться не надо. Поскольку это не value объект, он всегда передается по ссылке. А возвращаться может только в виде другой строки(или другой ссылки, если строка не изменилась).
Вообще-то идея string как неизменяемого объекта в NET мне нп\равится (правда, идея не Net, а Java принадлежит, а может, и кому-то до нее — не знаю). Разумеется, при наличии еще и StringBuilder.
GZ>Но особым плюсом такого подхода можно указать следующее:
GZ>GZ>string str1="this is the string";
GZ>.......
GZ>string str2="this is the string";
GZ>
GZ>Строка str1 и str2 — несмотря на то, что являются разными ссылками, в действительности ссылаются на одну и ту же строку.
Такое поведение и в С++. Еще в Borland C++ 3.1 было(merge duplicate strings). Только там оно управляемо через опции компилятора. Можно и отказаться
>Строка лежит в метаданных.
В С++ — в readonly данных (т.е. страница readonly). Изменить строку не удастся без шаманства.