информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяАтака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[c++] чепушина какая-то! lpctstr просто указатель 17.10.07 11:55  Число просмотров: 2416
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Если мы будем вызывать метод класса по указателю, то никаких конструкторов вызываться не будет, даже, если нужно. Просто, если мы попытаемся обратиться к не инициализированному объекту будет ошибка. Впрочем, если конструктор не вызывали, то и указатель будет пустой.
<programming>
[c++] сравнение std::string == const std::string vs std::string == lpctstr 17.10.07 07:41  
Автор: void <Grebnev Valery> Статус: Elderman
Отредактировано 17.10.07 07:49  Количество правок: 2
<"чистая" ссылка> <обсуждение закрыто>
В проекте есть большое число сравнений строк (STL имплементации Microsoft VC++8.0):

const std::string s1(_T("some string1"));
const std::string s2(_T("some string2"));
...
void f()
{
std::string value;
...
if( value == s1) {
...
} else if ( value == s2) {
...
}
...
}

На мой вопрос, почему в качестве констант для сравнения используются const std::string, а не const LPCTSTR, местные специалисты объяснили, что всё дело в перформанс. Типа, в случае const std::string s1, конструктор s1 будет вызван только один раз (при инициализации всех статических объектов), а вот в случае (как я предлагал) использования const LPCTSTR для неё будет автоматически создаваться (STL-ем) временный std::string объект, который и будет потом сравниваться с value. Т.е. в коде ниже, в блоке if(...), каждый раз будет создаваться временный std::string(s3):

const LPCTSTR s3 = _T("some string3");

void f()
{
std::string value;
...
if( value == s3) {

...

Посмотрев имлементациию оператора operator== :

template<class _Elem,
class _Traits,
class _Alloc> inline
bool __CLRCALL_OR_CDECL operator==(
const basic_string<_Elem, _Traits, _Alloc>& _Left,
const _Elem *_Right)
{ // test for string vs. NTCS equality
return (_Left.compare(_Right) == 0);
}

я не смог обнаружить создания какого либо временного объекта, равно как и в имплементации basic_string::compare(const _Elem *_Right):

int __CLR_OR_THIS_CALL compare(const _Elem *_Ptr) const
{ // compare [0, _Mysize) with [_Ptr, <null>)
return (compare(0, _Mysize, _Ptr, _Traits::length(_Ptr)));
}

Я чего-то не допонимаю специалистов. Покажите мне пальцем, пожалуйста, гдеж этот временный объект-то создаётся? Думаю, ошибочка у специалистов вышла, а я -то говорю всё правильно - никакого временного объекта вовсе и не создаётся, и не нужно использовать

const std::string s1(_T("some string1"));

а нужно использовать

const LPCTSTR s1 = _T("some string1");

поскольку так будет проще и быстрее. Правильно я говорю?

И последний вопрос: "compare", насколько я понимаю, использует посимвольное сравнение. Может вообще заменить это на strcmp?

Спасибо.
[C++] после нехитрого дебага специалисты были убеждены в их неправоте. 18.10.07 04:29  
Автор: void <Grebnev Valery> Статус: Elderman
Отредактировано 18.10.07 04:53  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
Кстати, появились причины не менять код - если менять, то надо перелопачивать там тонны кода. Решил оставить как есть.
Спасибо всем.
Специалисты выросли на Borland. Борландрвскмй AnsiString не... 17.10.07 12:11  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Специалисты выросли на Borland. Борландрвскмй AnsiString не имеет оператора == сравнивающего с const char * и потому при сравнении создается временный AnsiString. std::string же имеет оператор сравнения с const char * и врядли какаято даже самая тупая имплементация STL будет в этом операторе создавать временный объект.
Но вообще говоря сравнение std::string с std::string быстрее чем std::string с const char * потому что во втором случае приходится еще определять длину строки, или же в процессе проверять еще каждый сравниваемый символ с нулем.
Верно. Хорошее замечание. 18.10.07 04:38  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
[c++] чепушина какая-то! lpctstr просто указатель 17.10.07 11:55  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Если мы будем вызывать метод класса по указателю, то никаких конструкторов вызываться не будет, даже, если нужно. Просто, если мы попытаемся обратиться к не инициализированному объекту будет ошибка. Впрочем, если конструктор не вызывали, то и указатель будет пустой.
Не совсет так (см замечание автора выше по нитке). Если бы... 18.10.07 04:46  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Если мы будем вызывать метод класса по указателю, то
> никаких конструкторов вызываться не будет, даже, если
> нужно. Просто, если мы попытаемся обратиться к не
> инициализированному объекту будет ошибка. Впрочем, если
> конструктор не вызывали, то и указатель будет пустой.

Не совсет так (см замечание автора выше по нитке). Если бы не было бы определено операторов: bool operator== ( const char* lhs, const string& rhs ); bool operator== ( const string& lhs, const char* rhs );, а был бы только оператор bool operator== ( const string& lhs, const string& rhs ); (что по некоторой инфе и было на заре STL):, то конструктор (string ( const char * s );) вызывался бы автоматически, создавая дополнительные оверхеды.





Специалисты однозначно не правы 17.10.07 08:47  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> поскольку так будет проще и быстрее. Правильно я говорю?
>
> И последний вопрос: "compare", насколько я понимаю,
> использует посимвольное сравнение. Может вообще заменить
> это на strcmp?

Я не знаю достоверно, но вообще такие моменты вполне по силам взять на себя оптимизатору - надо проверять. В любом случае выигрыш вряд ли будет большим (если только ты не делаешь несколько сотен/тысяч таких сравнений в секунду).
Там делается при старте программы ~440000*50 сравнений... 18.10.07 04:50  
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> > поскольку так будет проще и быстрее. Правильно я
> говорю?
> >
> > И последний вопрос: "compare", насколько я понимаю,
> > использует посимвольное сравнение. Может вообще
> заменить
> > это на strcmp?
>
> Я не знаю достоверно, но вообще такие моменты вполне по
> силам взять на себя оптимизатору - надо проверять. В любом
> случае выигрыш вряд ли будет большим (если только ты не
> делаешь несколько сотен/тысяч таких сравнений в секунду).
Там делается при старте программы ~440000*50 сравнений. 440000 -число вызовов функции сравнения. 50 - число if()else if()else if в этой функции.

1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach