![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
const в параметрах [D7]
махс © (2008-03-02 11:23:00)Загадка для меня. В каких случаях в процедуру или функцию передают значение константой;
Я понимаю, что это означает. Но вот когда именно это применяют не пойму. Бывает выжу чужой исходник, в функцию передают пять параметров - не один внутри функции не изменяют, а с констнтой идет только самый первый.
Поясните?
Спасибо.
oxffff (2008-03-03 08:47:00) [1]
> Германн © (03.03.08 03:23) [85]
>
> > Riply © (03.03.08 03:03) [84]
> >
> > > [80] Игорь Шевченко © (02.03.08 23:11)
> > > Вопрос был про Integer, а флейм развели на 4 страницы
> >
> > Не все всё знают.
> > Мне, например, было интересно (надеюсь и полезно) почитать
>
> > эту ветку :)
> >
>
> Ну хоть тебе это пошло в плюс. Уже хорошо. Меньше будет
> попыток "ненаучного тыка" в очевидных случаях".
см. oxffff © (02.03.08 16:10) [15].
Очевидный случай?
oxffff (2008-03-03 08:40:00) [2]
> Loginov Dmitry © (02.03.08 23:13) [81]
> > Код включает Addref + try finally finalize(LStrClr)
>
>
> Это уже действительно убедительно, и мне к сожалению, нужно
> признать, что я не прав. Не думал, что компилятор будет
> вставлять try...finally, даже если процедура пустая. Я бряку
> ставил на END, и в ассемблерном коде просто не заметил ничего,
> кроме pop ebp и ret.
> А твой тест с ShowMessage по преждему так и есть - некорректный.
> Он показывает, что быстрее (без оптимизации у меня - в
> 13 раз) выполняется второй цикл (не важно, какой именно).
> И это несмотря на наличие дополнительных 2х десятков машинных
> команд, связанных с реализацией try..finally.
отключи оптимизацию.
И делай rebuild.
И тест будет показывать разницу в виде задержек именно на Addref/finalize+try finally.
Германн (2008-03-03 03:23:00) [3]
> Riply © (03.03.08 03:03) [84]
>
> > [80] Игорь Шевченко © (02.03.08 23:11)
> > Вопрос был про Integer, а флейм развели на 4 страницы
>
> Не все всё знают.
> Мне, например, было интересно (надеюсь и полезно) почитать
> эту ветку :)
>
Ну хоть тебе это пошло в плюс. Уже хорошо. Меньше будет попыток "ненаучного тыка" в очевидных случаях".
Riply (2008-03-03 03:03:00) [4]> [80] Игорь Шевченко © (02.03.08 23:11)
> Вопрос был про Integer, а флейм развели на 4 страницы
Не все всё знают.
Мне, например, было интересно (надеюсь и полезно) почитать эту ветку :)
Германн (2008-03-03 02:30:00) [5]
> Anatoly Podgoretsky © (03.03.08 02:02) [82]
>
> Const это не производительность, а защита
>
Угу. Это защита от дурака. Или от умного в неадекватном состоянии.
Что увеличивает умному широту маневра, в т.ч. и с точки зрения повышения производительности. Но и ИШ в
> Игорь Шевченко © (02.03.08 23:11) [80]
полностью прав.
Anatoly Podgoretsky (2008-03-03 02:02:00) [6]Const это не производительность, а защита
Loginov Dmitry (2008-03-02 23:13:00) [7]> Код включает Addref + try finally finalize(LStrClr)
Это уже действительно убедительно, и мне к сожалению, нужно признать, что я не прав. Не думал, что компилятор будет вставлять try...finally, даже если процедура пустая. Я бряку ставил на END, и в ассемблерном коде просто не заметил ничего, кроме pop ebpи ret.
А твой тест с ShowMessage по преждему так и есть - некорректный. Он показывает, что быстрее (без оптимизации у меня - в 13 раз) выполняется второй цикл (не важно, какой именно). И это несмотря на наличие дополнительных 2х десятков машинных команд, связанных с реализацией try..finally.
Под фразой
> Именно в примере [2] оптимизации от этого никакой нет, т.к.
> нет обращения к отдельным символам строки. В других же случаях наличие
> Const может заметно улучшить производительность приложения по сравнению с его отсутствием.
я имею ввиду, что при отсутствии Const в процедуре будут присутствовать дополнительные машинные команды. Но без задержек на UniqueString их влияние на производительность программы настолько ничтожно, что на написание дополнительного слова Const в некоторыхслучаях можно смело забить. В таких случаях оптимизация, достигнутая с использованием Const, не ощущается.
Игорь Шевченко (2008-03-02 23:11:00) [8]Вопрос был про Integer, а флейм развели на 4 страницы
oxffff (2008-03-02 22:46:00) [9]
> {RASkov} © (02.03.08 22:40) [78]
Компилятор решает как передать ссылку или значение
как для value передачи, так и для const передачи.
Разница в том, что при передачи ссылки при value передачи, в процедуре будет создана копия все равно.
+К этим затратам можно отнести addref/finalize для managed типов.
А для const передачи этого не будет.
{RASkov} (2008-03-02 22:40:00) [10]> [75] oxffff © (02.03.08 22:27)
> А для const нет (не будет копии в случае передачи ссылки).
Но если я верно понял [62], то при конст не ссылка передается, а как удумает компилятор... т.е. запросто может и скопироваться значение....
Странно все это :)
oxffff (2008-03-02 22:36:00) [11]
> Anatoly Podgoretsky © (02.03.08 22:25) [73]
> > oxffff (02.03.2008 22:11:06) [66]
>
> Ну ты говоришь про строки, а претензии ко мне по Интегер
> :-)
> Я разве спорю, я могу только повторить, я в курсе как на
> данный момент передаются строки, во всех трех вариантов
> и знаю как использовать все три.
См. [66]
И в данном конкретном случае передача по значению.
-> следовательно [7] неверно для [6].
oxffff (2008-03-02 22:34:00) [12]
> Loginov Dmitry © (02.03.08 22:22) [72]
> > Согласно [19] ты утверждал, что разницы между .... Нет
>
>
> Вот именно!
>
>
> > Тебе показали, что это не так.
>
>
> Да никто до сих пор не показал, что это не так! Один ты
> только пытаешься это доказать. Причем доказательств ты никаких
> не представляешь. Только какие-то надуманные тэсты с GetTickCount,
> которые не говорят ни о чем! Абсолютно ни о чем! Ты же
> что-то свое отстаиваешь, приводя ShowMessage, как "убедительный"
> довод.
Для особо непоняливых
procedure abc(s:string);
begin
......
end;
Код включает Addref + try finally finalize(LStrClr)
В
procedure abcEx(const s:string);
begin
......
end;
этого нет.
Для особо непоняливых
Если ты не понял, то тебе в клинику.
oxffff (2008-03-02 22:27:00) [13]
> {RASkov} © (02.03.08 22:20) [71]
Для value передачи всегда создается копия в стеке.
Если вызывающий передает ссылку (так выбрал компилятор), то в процедуре будет код, который создаст копию в стеке.
А для const нет (не будет копии в случае передачи ссылки).
Здесь только отладчик поможет. :)
Anatoly Podgoretsky (2008-03-02 22:26:00) [14]> oxffff (02.03.2008 22:14:09) [69]
И для динамических массивов я тоже знаю, там же копия не создается.
Anatoly Podgoretsky (2008-03-02 22:25:00) [15]> oxffff (02.03.2008 22:11:06) [66]
Ну ты говоришь про строки, а претензии ко мне по Интегер :-)
Я разве спорю, я могу только повторить, я в курсе как на данный момент передаются строки, во всех трех вариантов и знаю как использовать все три.
Loginov Dmitry (2008-03-02 22:22:00) [16]> Согласно [19] ты утверждал, что разницы между .... Нет
Вот именно!
> Тебе показали, что это не так.
Да никто до сих пор не показал, что это не так! Один ты только пытаешься это доказать. Причем доказательств ты никаких не представляешь. Только какие-то надуманные тэсты с GetTickCount, которые не говорят ни о чем! Абсолютно ни о чем! Ты же что-то свое отстаиваешь, приводя ShowMessage, как "убедительный" довод.
{RASkov} (2008-03-02 22:20:00) [17]> [66] oxffff © (02.03.08 22:11)
Я так понял, что для параметров Integer легче(быстрее) копию передать, нежели работать с ихими ссылками....
Опять же.... для In64 уже через const передается:
function StrToInt64Def(const S: string; const Default: Int64): Int64;
var
E: Integer;
begin
Val(S, Result, E);
if E <> 0 then Result := Default;
end;
Сумбурно..... но без пива здесь уже никак наверное.... :) ВоПщем нужно в ЦПУ_Виндоу смотреть..... жаль только я там не секу :(
oxffff (2008-03-02 22:16:00) [18]
> Loginov Dmitry © (02.03.08 22:13) [67]
Согласно [19] ты утверждал, что разницы между
procedure abc(s:string);
begin
......
end;
procedure abcEx(const s:string);
begin
......
end;
Нет. Тебе показали, что это не так.
Пятый раз спросишь где показали?
oxffff (2008-03-02 22:14:00) [19]
> Anatoly Podgoretsky © (02.03.08 22:11) [65]
>
> > procedure abc(s:string);
>
> > procedure abcEx(const s:string);
>
> В обеих случай строку изменить не удастся.
Это только для string у нее такова семантика,
так как явные изменения "нормальные" (распознаваемые компилятором) добавляется вызов UniqueString. А для dyna array нет.
Anatoly Podgoretsky (2008-03-02 22:13:00) [20]Я знаю как это работает для строк.
А вы решили видимо опять в который раз развить большую ветку.