![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Строка, лучший способ сравнения
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;