В проекте есть большое число сравнений строк (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?
Спасибо.
|