информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяSpanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[c++] сравнение std::string == const std::string vs std::string == lpctstr 17.10.07 07:41  Число просмотров: 7867
Автор: 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?

Спасибо.
<programming> Поиск 






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


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