Из серии очевидных не для всех очевидностей
Тут мне в комментах напоминают что в ранних фортранах нельзя было просто писать обращение к элементу массива более сложное, чем A(2*I+3)
Решение на сам деле для автокода (к каковому классу ранние фортраны и принадлежали) вполне разумное и встречается не только там:
Потому как A(I) реализуется как Addr(A) + I*sizeof(элемента А)
Понятно что A(2*I+3) переходит соответственно в (Addr(A) + 3*sizeof(элемента А)) + I*(2 * sizeof(элемента А))
(напомню что в классическом фортране нет рекурсии и все массивы статически размещены в памяти и имеют константный адрес - так что и Addr(A) и Addr(A) + 3*sizeof(элемента А) - просто константы)
То есть с точки зрения реализации обе конструкции идентичны по сложности* - одно умножение на константу и одно сложение с константой.
Что-то более сложное уже требует реального вычисления индексного выражения
Тож самое кстати и с iSUB-ами - они в варианте линейных функций над ними еще реализуются просто соответствующей модификацией дескриптора массива (все равно необходимого для реализаций конструкций типа М(I,*)). Чтото более сложное уже хуже.
Специально для
rdia: на деле iSUB-ы не заменяются в С/C++ макросами или инлайн-функциями. Точнее все хорошо ровно до тех пор, пока на массив не создается ссылка или он не передается параметром. Там макросы и inline-функции обламываются. В отличие от.
*) Исключением является передача массива параметром - но и там усложнение умеренное - в случае когда к индексу прибавляется ненулевая константа - два сложения вместо одного.
Решение на сам деле для автокода (к каковому классу ранние фортраны и принадлежали) вполне разумное и встречается не только там:
Потому как A(I) реализуется как Addr(A) + I*sizeof(элемента А)
Понятно что A(2*I+3) переходит соответственно в (Addr(A) + 3*sizeof(элемента А)) + I*(2 * sizeof(элемента А))
(напомню что в классическом фортране нет рекурсии и все массивы статически размещены в памяти и имеют константный адрес - так что и Addr(A) и Addr(A) + 3*sizeof(элемента А) - просто константы)
То есть с точки зрения реализации обе конструкции идентичны по сложности* - одно умножение на константу и одно сложение с константой.
Что-то более сложное уже требует реального вычисления индексного выражения
Тож самое кстати и с iSUB-ами - они в варианте линейных функций над ними еще реализуются просто соответствующей модификацией дескриптора массива (все равно необходимого для реализаций конструкций типа М(I,*)). Чтото более сложное уже хуже.
Специально для
*) Исключением является передача массива параметром - но и там усложнение умеренное - в случае когда к индексу прибавляется ненулевая константа - два сложения вместо одного.