Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Строка, лучший способ сравнения


Страницы:   1 2

vadim83 ©   (2015-08-07 12:33:00) 

Друзья, вопрос из разряда понять, как оно "внутри" сравнивается/проверяется. Покажу на примере:
function (s: string): string;
begin
  if s = '' then
    Result := 'empty'
  else
    Result := DoSomething(s);
end;


Простая функция, коих найдется в каждом проекте. Вот мне интересно, как лучше/правильнее/быстрее проверить строку на "пустоту". Ведь есть вариант сравнить так:
function (s: string): string;
begin
  if Length(s) = 0 then
    Result := 'empty'
  else
    Result := DoSomething(s);
end;


Тип string имеет свой счетчик ссылок и длину строки, по идее второй вариант должен быть быстрее, но я не знаю как оно "под капотом" это проверяет, поскольку не силен в асме.

Еще догадываюсь, что т.н. пустота в выражении (s <> '') это тоже самое что сравнить с nil, но тут есть сомнения. Поясните пожалуйста эти моменты, у кого уже сложилась вся картинка.
Спасибо.


icWasya   (2015-08-07 15:46:00) [21]

В процедуре сравнения строк сначала проверяется равенство указателей - если оба Nil - то строки равны. Если Nil - только один, то проверяется длина второго. Если там ноль, то строки равны, елли нет-то этот другой больше. Если оба не Nil-То делается ещё куча проверок.
Так что сравнивать  с Nil будет быстрее.


кгшзх   (2015-08-07 13:50:00) [22]

var pb, pb1 : PByte;
begin
GetMem(pb, 10);     //берем 10 байт
ZeroMemory(pb,10);  //обнуляем все 10
pb1 := pb;
inc(pb1);           //нацеливаемся на второй слева
pb1^ := ord('A');   //пишем в него "другие символы"
if PChar(pb) <> nil then ShowMessage('Ку-ку!');


Dimka Maslov   (2015-08-07 13:17:00) [23]

Если @S[1] <> nil, то пустота строки проверяется проверкой длины строки, которая записана в двойном слове, расположенном до первого символа. Если же @S[1] = nil, следовательно строка пустая. Так в любом случае происходят обе проверки


кгшзх   (2015-08-07 13:17:00) [24]

мне казалось, что если s содержит первым символом #0, а потом другие символы, то ваше преобразование отработает неверно.

а то что под буфер с нулевыми байтами внутри использовать тип string
и непарясь при этом ни о чем
размышлять о длинах строк - это тебе не казалось чудаковатым?


кгшзх   (2015-08-07 13:08:00) [25]

Т.е. по вашему это самый быстрый и лучший вариант?

по нашему пустая строка это не нил. больше ничего не имелось ввиду.

мне казалось, что если

ну ты же вроде умный.
знаешь что в строке есть и счетчик и длина.
но если строка указывает на нил, то кто и как сможет проверить (по какому етиамать адресу)
что длина нулевая и счетчик нулевой?


vadim83   (2015-08-07 12:58:00) [26]


>  if PAnsiChar(s) <> nil then

мне казалось, что если s содержит первым символом #0, а потом другие символы, то ваше преобразование отработает неверно.


vadim83   (2015-08-07 12:55:00) [27]


> кгшзх ©

Т.е. по вашему это самый быстрый и лучший вариант?
ps: в изящных остротах тоже не силен, согласен)


кгшзх   (2015-08-07 12:45:00) [28]

var s : string;
begin
s := '';
if PAnsiChar(s) <> nil then
 ShowMessage('А ты точно только только в асме не силен?')
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо