2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Принципиальное отличие в представлении массивов и записей?
Сообщение06.06.2009, 19:36 
Аватара пользователя
Доброго времени,

продолжаю читать Вирта, глава 1.10 "представление типов"
возник такой вопрос : почему смещения компонент записей могут вычисляться на этапе трансляции, а смещения компонент массивов нет? В чем принципиальное отличие записей и массивов?

отрывок из книги

Изображение

 
 
 
 Re: Принципиальное отличие в представлении массивов и записей?
Сообщение06.06.2009, 20:04 
Аватара пользователя
GrishinUS в сообщении #220133 писал(а):
почему смещения компонент записей могут вычисляться на этапе трансляции, а смещения компонент массивов нет?

Потому что размер компонентов записи известен компилятору и к компонентам запесей обычно обращаются непосредственно. Компилятор знает адрес начала записи, количество компонентов, их размер, т.е. он может получить смещение любого компонента в этой записи. С массивом так не всегда получится, поскольку номер элемента массива обычно (но не всегда) вычисляется только в ходе выполнения программы, а для вычисления адреса элемента массива нужно знать этот номер.

 
 
 
 Re: Принципиальное отличие в представлении массивов и записей?
Сообщение07.06.2009, 13:39 
Аватара пользователя
Спасибо за ответ,

размер компоненты массива тоже известен компилятору, разве нет?
мы неявно определяем его с помощью указания типа, например
Код:
type arr01 = array [1..10] of word;

это означает что на массив arr01 отводится 20 байт (2 байта * 10 элементов).

По-моему, для упаковки достаточно знать всего две вещи :
1) размер машинного слова
2) размер компоненты массива/записи
поэтому мне не совсем понятно для чего Вы упомянули номер элемента массива.

Если неправ, поправьте.

 
 
 
 Re: Принципиальное отличие в представлении массивов и записей?
Сообщение07.06.2009, 13:47 
GrishinUS в сообщении #220307 писал(а):
размер компоненты массива тоже известен компилятору, разве нет?

Он-то известен, конечно. Но означает это лишь то, что доступ к элементам обычного массива и к элементам массива записей осуществляется одинаково эффективно. Тут нет разницы, из чего составлен массив.

Но есть принципиальная разница между массивом (неважно какого типа) и отдельной записью как таковой. В первом случае адрес поля может быть вычислен только уже на этапе выполнения, и никак иначе, во втором -- ещё на этапе компиляции.

Хотя есть и "ньюанс". Если Вы напишете что-нибудь типа $a[i]$ -- компилятор будет вынужден подсчитывать адрес оперативно. Ежели ж типа $a[17]$ -- грамотный компилятор подставит в поле смещения константу.

 
 
 
 Re: Принципиальное отличие в представлении массивов и записей?
Сообщение07.06.2009, 14:12 
Аватара пользователя
Теперь понятно,
большое спасибо!

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group