Другие языки программирования и технологии
Зачем придумали процедуры inc и dec
Мне очень сложно понять смысл создания этих процедур, поэтому я решил спросить у вас)))
Во первых это не просто увеличение\уменьшение на еденицу...
Это увеличение на минмальный размер для переменной
Для байта - это 1, для типизированого указателя это размер типа, для нетипизированого это размер указателя. :)
ps
например такой код....
Type
TMyRecord = record
a:integer;
b:real;
end;
Var
p:pointer
b:^TMyRecord;
Begin
getmem(p,Sizeof(TMyRecord)*10);
b:=p;
//теперь у нас есть массив из 10 записей TMyRec;
//как обратится к пятой записи?
//Как вариант это узнать размер записи SizeOf(TMyRec) и сдвинуть указатель на 4 позиции, b:=b+sizeof(TmyRec)*4
// Но для чего такой велосипед из вызова кучи функций?)
inc(b,4); //мы пойдем по простому пути... запись делает тоже самое что и b:=b+sizeof(TmyRec)*4
b^.a; // так мы обратимся к пятой записи
end.
Это лиш один из вариантов использования, коих кстати масса) и ps. ассемблерный листинг
Var
i:integer;
begin
i:=0; //mov i,0
i:=i+1; // add i,1
inc(i) // inc i
end.
так что это даже не конструкция языка паскаль а ассемблерная команда процессора)
Это увеличение на минмальный размер для переменной
Для байта - это 1, для типизированого указателя это размер типа, для нетипизированого это размер указателя. :)
ps
например такой код....
Type
TMyRecord = record
a:integer;
b:real;
end;
Var
p:pointer
b:^TMyRecord;
Begin
getmem(p,Sizeof(TMyRecord)*10);
b:=p;
//теперь у нас есть массив из 10 записей TMyRec;
//как обратится к пятой записи?
//Как вариант это узнать размер записи SizeOf(TMyRec) и сдвинуть указатель на 4 позиции, b:=b+sizeof(TmyRec)*4
// Но для чего такой велосипед из вызова кучи функций?)
inc(b,4); //мы пойдем по простому пути... запись делает тоже самое что и b:=b+sizeof(TmyRec)*4
b^.a; // так мы обратимся к пятой записи
end.
Это лиш один из вариантов использования, коих кстати масса) и ps. ассемблерный листинг
Var
i:integer;
begin
i:=0; //mov i,0
i:=i+1; // add i,1
inc(i) // inc i
end.
так что это даже не конструкция языка паскаль а ассемблерная команда процессора)
Они выполняются быстрее, чем простое сложение с 1 и вычитание 1, так как в процессоре для увеличения и уменьшения на 1 есть особые более быстрые команды.
Для начала предположим, что Inc и Dec - стандартные функции Паскаля.
Если кратко, то 2 причины:
1. Длина строки 'Inc(i);', меньше, чем длина строки 'i:=i+1;' - код получается короче и i не встречается дважды
2. Работа с этих функций с указателями позволяет эффективнее работать с массивами данных
А теперь подробно:
Они используются для увеличения/уменьшения аргумента на константу или значение другой переменной.
Во всех известных мне типах микропроцессоров (и даже в кодах .NET) за увеличение/уменьшение на константу отвечает отдельная команда (точнее, 4 команды - увеличение на 1 и увеличение на константу, а также две - для уменьшения, но это не важно в текущем контексте) и отдельная - за изменение на значение переменной (тоже пара команд).
Все эти команды используются, когда компилятор переводит функции Inc и Dec в машинные коды. Эффективность выполнения команд (по скорости работы):
изменение на 1 <= изменение на константу <= изменение на переменную
В старых версиях компилятора на старых микропроцессорах применение Inc и Dec влияло на производительность, но сейчас разница не столь велика и оптимизатор стал значительно эффективнее.
Для увеличения/уменьшения целых чисел используются также Succ и Pred (которые увеличивают/уменьшают на 1) и транслируются в ту же команду, но между ними есть различия:
-- Inc и Dec имеют параметр - количество элементов для увеличения/уменьшения
-- Inc и Dec умеют работать с указателями, увеличивая их кратно размеру данных, на которые они указывают
Если кратко, то 2 причины:
1. Длина строки 'Inc(i);', меньше, чем длина строки 'i:=i+1;' - код получается короче и i не встречается дважды
2. Работа с этих функций с указателями позволяет эффективнее работать с массивами данных
А теперь подробно:
Они используются для увеличения/уменьшения аргумента на константу или значение другой переменной.
Во всех известных мне типах микропроцессоров (и даже в кодах .NET) за увеличение/уменьшение на константу отвечает отдельная команда (точнее, 4 команды - увеличение на 1 и увеличение на константу, а также две - для уменьшения, но это не важно в текущем контексте) и отдельная - за изменение на значение переменной (тоже пара команд).
Все эти команды используются, когда компилятор переводит функции Inc и Dec в машинные коды. Эффективность выполнения команд (по скорости работы):
изменение на 1 <= изменение на константу <= изменение на переменную
В старых версиях компилятора на старых микропроцессорах применение Inc и Dec влияло на производительность, но сейчас разница не столь велика и оптимизатор стал значительно эффективнее.
Для увеличения/уменьшения целых чисел используются также Succ и Pred (которые увеличивают/уменьшают на 1) и транслируются в ту же команду, но между ними есть различия:
-- Inc и Dec имеют параметр - количество элементов для увеличения/уменьшения
-- Inc и Dec умеют работать с указателями, увеличивая их кратно размеру данных, на которые они указывают
с чего все взяли, что именно на единицу, если там возможно использовать два параметра, и второй указывает на величину изменения? по теме, процедуры были введены для оптимизации.
не начинай даже, не надо
В принципе тебе уже ответили правильно, так что могу лишь добавить к этому, что инкремент и декремент это не арифметические операции, не смотря на результат. Т. е. результат этот достигается другим путём, а именно сдвигом бит в двоичном представлении.
Похожие вопросы
- Процедуры в PascalABC.NET. Ввод данных
- Процедуры в Pascal
- Ассемблер рекурсивная процедура. вычисление факториала, в чем проблемма программы? в отладчике она зацикливается.
- dec hex oct bin что значит
- Нужна помощь в делфи. Dec to hex
- Turbo Pascal. 2 задачи на процедуры и функции
- С++. Как сделать, чтобы значение массива, созданного в структуре изменялось в другой процедуре?
- Процедуры и операторы это одно и тоже?
- PascalABC. Когда применяются процедуры, вместо функций?
- Как в C++ Builder 6 произвести ипорт процедуры Dll?
http://faydoc.tripod.com/cpu/dec.htm
http://faydoc.tripod.com/cpu/sub.htm