Я подозреваю, что вы читали о Ada неправильно, и, вероятно, хуже, поощряет вас думать о Ada в неправильном направлении.
Целью Ada является поощрение мышления в проблемной области, то есть указание того, что должно произойти, а не думать в области решений, то есть реализовать мелкие детали именно того, как именно.
Таким образом, цель состоит в том, чтобы пересечь все Лица, и верните Истину при встрече с первым более 18, иначе верните False.
И все.
По большому счету, Ada ничего не дает о подробностях о том, как это делается, если эти семантики выполнены.
Затем, вы намерены, что вы просто ожидаете, что компилятор сделает все правильно.
Теперь индивидуальный компилятор может выбрать одну реализацию над другой - или может переключаться между реализациями в соответствии с эвристикой оптимизации, учитывая, какой процессор он компилирует, а также размер объектов (они будут вписываться в регистр?) и т. д.
Вы можете представить себе процессор с большим количеством регистров, где одна строка в кеше считывает выполнение копии быстрее, чем работает на месте (особенно если нет изменений для записи на содержимое P) или других целевых ЦП где верно обратное. Почему вы хотите, чтобы компилятор не смог добиться лучшей реализации?
Хорошим примером этого является подход Ады для передачи параметров подпрограммам - имя, значение или ссылки семантика действительно не применяются - вместо этого, можно указать параметр режима прохождения - in
, out
или in out
описания потоков информации в (или из) подпрограммы. Интуитивно понятный, обеспечивает семантику, которая может быть более строго проверена, и оставляет компилятор свободным, чтобы выбрать лучшую (самую быструю, наименьшую, в зависимости от вашей цели) реализацию, которая правильно подчиняется этой семантике.
Теперь для конкретного компилятора Ada можно будет сделать плохой выбор, а 30 лет назад, когда компьютеры были едва ли достаточно большими, чтобы запускать компилятор Ada, вы, возможно, обнаружили, что производительность была скомпрометирована для простоты в ранних выпусках компилятор.
Но у нас есть еще тридцать лет разработки компилятора, работающих на более мощных компьютерах. Итак, сегодня я бы ожидал, что компилятор, как правило, сделает лучший выбор. И если вы обнаружите, что конкретный компилятор не учитывает оптимизацию производительности, напишите запрос расширения. Компиляторы Ada не идеальны, как и любой другой компилятор.
В этом конкретном примере я обычно ожидал бы, что P будет курсором в массив, и операции будут выполнены на месте, то есть эталонная семантика.Или, возможно, гибрид между формами, где одна выборка памяти в регистр выполняет несколько операций, например, частичную форму семантики значений.
Если ваш интерес академичен, вы можете легко просмотреть сборку, полученную от любого компилятора, который вы используете и узнаете. Или напишите все три версии выше и сравните их.
Где вы читали, что Ada использует семантику значения для этого? –