процедура быстрее функции.. почему?
Модератор: Модераторы
-
Mirage
- энтузиаст
- Сообщения: 880
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
SovNarKom: Что значит не будут? const дает возможность оптимизировать компилятору доступ к переменной, но нельзя ее изменять. Нетрудно догадаться что это за оптимизация. Это обращение к данной переменной как к переменной с var модификатором. Т.е. по ссылке.
Куда будут указывать обе ссылки в этом вызове?
Transform4Vector4s(V, M, V);
На V.
Только что проверил - так и есть. Delphi 7. Как с оптимизациями, так и без.
А ты проверял прежде чем безапелляционно заявить "не будут"?
Что касается модификатора - компилятор и сам может определить есть обращение к переменной на запись, или нет и оптимизировать в зависимости от. Причем выдавать warning в случае наличия var-параметра вкупе с оптимизированной переменной не мешало бы...
Куда будут указывать обе ссылки в этом вызове?
Transform4Vector4s(V, M, V);
На V.
Только что проверил - так и есть. Delphi 7. Как с оптимизациями, так и без.
А ты проверял прежде чем безапелляционно заявить "не будут"?
Что касается модификатора - компилятор и сам может определить есть обращение к переменной на запись, или нет и оптимизировать в зависимости от. Причем выдавать warning в случае наличия var-параметра вкупе с оптимизированной переменной не мешало бы...
-
Mirage
- энтузиаст
- Сообщения: 880
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
stopkin: Не совсем так. В простейших случаях, например в случае функции, возвращающей новый вектор по трем числам, действительно Result располагается на месте переменной, которой его присваивают.
Но в случае более сложной функции, например описанной мной Transform4Vector4s, Result создается уже на стеке, затем перемещается четырьмя movsd.
И это правильно, иначе тот подводный камень имел место бы и здесь, а в случае функции это недопустимо. Ведь передавая в процедуру один и тот же параметр мы понимаем, что он может измениться, а при присваивании значения функции он до выхода из функции измениться ну никак не должен.
Но в случае более сложной функции, например описанной мной Transform4Vector4s, Result создается уже на стеке, затем перемещается четырьмя movsd.
И это правильно, иначе тот подводный камень имел место бы и здесь, а в случае функции это недопустимо. Ведь передавая в процедуру один и тот же параметр мы понимаем, что он может измениться, а при присваивании значения функции он до выхода из функции измениться ну никак не должен.
