![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование Result - как переменной в функции.
Riply © (2007-01-29 22:08:00)Здравствуйте!
Не могу понять, как "правилнее" делать.
Например у нас есть две функции поиска (ну в очень большом PByte :):
function Byte_Pos(const FindByte: Byte; const pData, pExit: PByte): PByte;
begin
Result := pData;
while (Result <> pExit) and (Result^ <> FindByte) do inc(Result);
if Result = pExit then Result:= nil;
end;
function Byte_PosTmp(const FindByte: Byte; const pData, pExit: PByte): PByte;
var
pTmp: PByte;
begin
pTmp := pData;
while (pTmp <> pExit) and (pTmp^ <> FindByte) do inc(pTmp);
if pTmp = pExit then Result:= nil else Result := pTmp;
end;
Какую из них лучше использовать и ,главное, почему ?
Сергей М. (2007-01-30 11:23:00) [1]
> Riply © (30.01.07 11:17) [10]
Ну выполни приведение типов, вот проблема-то)
while Cardinal(Result) <= Cardinal(pExit)
Sha (2007-01-30 11:22:00) [2]> Riply © (30.01.07 11:17) [10]
Все зависит от поставленной цели.
Если функция длиннее 5 строк и вызывается миллионы раз, а сама никого не вызывает, я предпочту второй способ.
Riply (2007-01-30 11:17:00) [3]>[6] Сергей М. © (30.01.07 08:55)
Это разве скомпилируется "while (Result <= pExit) do" ?
У меня, сейчас нет возможности проверить :(
>[9] Sha © (30.01.07 11:04)
Т.е. при обработке большого количества данных, лучше использовать второй способ ?
Sha (2007-01-30 11:04:00) [4]Вообще возможны 2 подхода:
1. Добиться экономности кода и минимума локальных переменных.
2. Оставить компилятору максимум возможности по оптимизации кода. При
этом вводятся локальные переменные, используемые на коротких участках
кода, а присваивание результата откладывается как можно дальше. Как
правило, такой код получается быстрее и часто требует меньше памяти на стеке.
Плохиш (2007-01-30 10:54:00) [5]
> tesseract © (30.01.07 10:49) [7]
> Не так - Нельзя возвращать через result локальные указатели.
Ой, а что такое "локальные указатели"? И где они в [0]?
tesseract (2007-01-30 10:49:00) [6]
> Palladin © (30.01.07 00:27) [3]
Не так - Нельзя возвращать через result локальные указатели.
Сергей М. (2007-01-30 08:55:00) [7]
> Какую из них лучше использовать и ,главное, почему ?
Оба нехороши.
Если указана область поиска в 1 байт (pData = pExit) и искомый байт находится в этой области, он не будет найден.
function Byte_Pos(const FindByte: Byte; const pData, pExit: PByte): PByte;
begin
Result := pData;
while (Result < =pExit) do
if Result^ = FindByte then
Exit
else
Inc(Result);
Result:= nil;
end;
Riply (2007-01-30 04:55:00) [8]Я полностью согласна и с [1] Palladin © (29.01.07 23:13)
и с "очень хамбл опиньен" от Германна :)
Но, изучая чужие исходники, снова и снова натыкаюсь на второй вариант.
Вот и стали закрадываться сомнения...
Германн (2007-01-30 02:27:00) [9]
> Riply © (29.01.07 22:08)
>
> Здравствуйте!
> Не могу понять, как "правилнее" делать.
> Например у нас есть две функции поиска (ну в очень большом
> PByte :):
> function Byte_Pos(const FindByte: Byte; const pData, pExit:
> PByte): PByte;
> begin
> Result := pData;
> while (Result <> pExit) and (Result^ <> FindByte) do inc(Result);
>
> if Result = pExit then Result:= nil;
> end;
>
> function Byte_PosTmp(const FindByte: Byte; const pData,
> pExit: PByte): PByte;
> var
> pTmp: PByte;
> begin
> pTmp := pData;
> while (pTmp <> pExit) and (pTmp^ <> FindByte) do inc(pTmp);
>
> if pTmp = pExit then Result:= nil else Result := pTmp;
> end;
> Какую из них лучше использовать и ,главное, почему ?
>
In my, ну очень хамбл опиньен, заводить лишнюю переменную будь то в стэке или где ещё - не рационально.
Palladin (2007-01-30 00:27:00) [10]кто должен разрушиться?
result? указатель?
как это он разрушиться?
разорвет под давлением что ли?
с какой стати вдруг?
по какой такой причине?
где это написано?
глупость, ничто никуда не разрушается...
tesseract (2007-01-29 23:23:00) [11]
> Palladin © (29.01.07 23:13) [1]
Это если Pbyte не указатель. А так - вроде должен разрушиться при выходе из функции.
Palladin (2007-01-29 23:13:00) [12]на практике - монопенисуально
но первая, мне лично, больше нравится