Re[14]: Об эффективности программ
От: GlebZ Россия  
Дата: 11.10.05 13:01
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

GZ>>strok — злобная функция, так как она использует static данные на уровне CRT.


PD>Хуже. Она использует __declspec(thread). Иначе, сам подумай, что будет, если ее начнут из разных потоков вызывать

Для этого достаточно одного потока.

PD>Во многих и даже очень многих могу

PD>const char* p — и я имею право предположить, что не будет.
+1. К сожалению const многие не ставят. Поэтому приходится лазить по коду и узнавать, можно или нельзя. Ну а в Net const в параметрах нет.

GZ>>По крайней мере одну придется делать(и не дай бог что TestWord тоже использует strtok):

GZ>>
GZ>>void MyWords(const char* str)
GZ>>{
GZ>>   char* myString=new char[strlen(str)+1];
GZ>>   strcpy(myString, str);
GZ>>   p=strtok(myString,",");
GZ>>   while(p)
GZ>>   {
GZ>>     TestWord(p);
GZ>>     p = strtok(NULL,",")
GZ>>   }
GZ>>}
GZ>>


PD>Да зачем же ? Пусть TestWord себе благополучно эту строку исследует (например, является ли слово палиндромом). Начало — p, конец — '\0', зачем мне тут подстроки в отдельный буфер копировать, когда и на месте все ясно ?

Честно говоря, аналогом можно считать больше wstring чем char*. Char* — это область памяти с которой можно сильно сглюкавить, что для Net противозаконно. Я когда код пишу, подразумеваю что им будут пользоваться и другие. А другие обычно в код функции не смотрят, а ориентируются по названию и параметрам. Поэтому всегда пытаюсь показать, что строка может быть изменена или нет, тем же const. Но бывает и такое:
if (bla-bla)
   strupr(lpStr);

То есть, не обязательно строка будет изменена. А защищать ее как-то уже надо. В Net над таким задумываться не надо. Поскольку это не value объект, он всегда передается по ссылке. А возвращаться может только в виде другой строки(или другой ссылки, если строка не изменилась). Именно в том, что это именно неvalue объект, и не хранится в стеке, скорее и стало определяющим фактом для выбора такого "функционального" пути.

Но особым плюсом такого подхода можно указать следующее:
string str1="this is the string";
.......
string str2="this is the string";

Строка str1 и str2 — несмотря на то, что являются разными ссылками, в действительности ссылаются на одну и ту же строку. Строка лежит в метаданных. Достаточно частый случай что константно описывают одну и ту же строку в разных частях программы. Компилятор сохраняет строку в одном и том-же месте.

С уважением, Gleb.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.