в Ada для обозначения указателей
Ptr.all[78] -- Запись с целочисленным полем
Ptr.all[78].Field --Целочисленное поле
Обратите внимание, что в Ada для обозначения указателей используется ключевое слово access, а не символ. Ключевое слово all используется в тех немногих случаях, когда требуется разыменование без выбора.
Реализация
Для косвенного обращения к данным через указатели требуется дополнительная команда в машинном коде. Давайте сравним прямой оператор присваивания с косвенным присваиванием, например:
C |
int*p = &i;
int *q = &j;
i=j; /* Прямое присваивание */
*p = *q; /* Косвенное присваивание */
Машинные команды для прямого присваивания:
C |
store R1,i
в то время как команды для косвенного присваивания:
load R1,&q Адрес (указуемого объекта)
C |
load R3,&p Адрес (указуемого объекта)
store R2,(R3) Сохранить в указуемом объекте
При косвенности неизбежны некоторые издержки, но обычно не серьезные, поскольку при неоднократном обращении к указуемому объекту оптимизатор может гарантировать, что указатель будет загружен только один раз. В операторе
p->right = p->left;
раз уж адрес р загружен в регистр, все последующие обращения могут воспользоваться этим регистром:
load R1 ,&p Адрес указуемого объекта
load R2,left(R1) Смещение от начала записи
store R2,right(R1) Смещение от начала записи
Потенциальным источником неэффективности при косвенном доступе к данным через указатели является размер самих указателей.