Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ inc(m,..) или m := m + ..

Автор: renesko1 14.02.2008 4:15

в чем разница ?

спасибо

Автор: Ozzя 14.02.2008 11:10

Для программирующего на языке Паскаль - никакого, за одним исключением - inc(...), насколько я помню, это борландовское нвовведение. В Паскале Вирта его нет. Соответственно, могут возникнуть нюансы в другой реализации Паскаля.
Лично я страюсь использовать форму

 i:=i+n

Автор: Bard 14.02.2008 12:00

эта тема мне очень знакома wink.gif ... когда мы готовились к олимпиаде в нашей команде возник вопрос о разницах этих функций !help.gif . ну мы долго копались 1.gif и в конце обнаружили что i:=i+1; работает быстрее respect.gif чем inc(i); на FP 2.2.0. по моему это главное различие yes2.gif

Автор: andriano 14.02.2008 12:34

Самое главное, что inc() - не функция, а инструкция процессора.
Собственно, и в язык она была введена исключительно из-за того, что язык Ассемблера х86 содержит несколько более высокоуровневых инсрукций, чем обычно встречается в ЯВУ. Одна из них inc.
И введено она, естественно, из соображения генерации более оптимального кода без лишней нагрузки на оптимизатор компилятора.
Кстати, косвенным подтверждением того, что это именно инструкция процессора, является тот факт, что нет ее аналога для чисел с плавающей точкой.

Автор: xds 14.02.2008 13:13

Inc(m); или m := m + 1; - для современного компилятора сгенерированный код должен быть идентичным.

Цитата
Самое главное, что inc() - не функция, а инструкция процессора.
Инструкций процессора вне специальных вставок (конструкций asm или inline) нет. "Процедура" Inc - это встроенная языковая конструкция.

Цитата
...Язык Ассемблера х86 содержит несколько более высокоуровневых инсрукций, чем обычно встречается в ЯВУ.
Каюсь (бью челом): ненал! blush.gif

Автор: volvo 14.02.2008 13:49

Цитата(Bard @ 14.02.2008 7:00) *
в конце обнаружили что i:=i+1; работает быстрее respect.gif чем inc(i); на FP 2.2.0.

А теперь - внимание, вопрос... Имеем программу:
var i: integer;

begin
i := 0;
writeln(i);
inc(i);
writeln(i);
i := i + 1;
writeln(i);
end.

и ее трансляцию на ассемблер (FPC 2.2.0 - Win32, Options -> Compiler -> Assembler -> List Source, и смотрим s-файл):
# [6] inc(i);
movl U_P$PROGRAM_I,%eax
addl $1,%eax
jno .Lj17
call FPC_OVERFLOW
.Lj17:
movl %eax,U_P$PROGRAM_I
# Register eax,ecx,edx allocated
.stabn 68,0,7,.Ll5 - _main
.Ll5:
# [7] writeln(i);
#
# [8] i := i + 1;
movl U_P$PROGRAM_I,%eax
addl $1,%eax
jno .Lj30
call FPC_OVERFLOW
.Lj30:
movl %eax,U_P$PROGRAM_I
# Register eax,ecx,edx allocated
.stabn 68,0,9,.Ll7 - _main
.Ll7:
# [9] writeln(i);

Как может inc работать медленнее при идентичных кодах? То, что на TP 7 Inc дает прирост в скорости более 20% - было, по-моему тестовые программы до сих пор лежат в FAQ-е.

Автор: xds 14.02.2008 14:11

Цитата(volvo @ 14.02.2008 16:49) *
Как может inc работать медленнее при идентичных кодах?
При оценке невооруженным глазом в командно-олимпиадных условиях - запросто! smile.gif

Автор: renesko1 14.02.2008 22:50

спасибо

Автор: andriano 15.02.2008 2:21

Цитата(volvo @ 14.02.2008 9:49) *
Как может inc работать медленнее при идентичных кодах?
В данном конкретном случае "идентичность" кода объясняется опцией компилятора делать проверку на переполнение.
В принципе, современный компилятор должен при отключенной проверке оба варианта транслировать в inc mem. Но как ведет себя FPC, не проверял. Борлланд, очевидно, генерировал разный код, из-за чего и была введена псевдофункция inc().