43592 (Распределение памяти), страница 2

2016-07-31СтудИзба

Описание файла

Документ из архива "Распределение памяти", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика" в общих файлах.

Онлайн просмотр документа "43592"

Текст 2 страницы из документа "43592"

запомнить, т.к. оно зависит лишь от нижних и верхних границ

индексов и местоположения массива в памяти. VAR_PART зависит от

значений индексов i,j,...,m и от размеров измерений d2,d3,...,

dn. Вычисление VAR_PART можно представить в более наглядном виде:

VAR_PART = первый индекс (i)

VAR_PART = VAR_PART*d2 + второй индекс (j)

VAR_PART = VAR_PART*d3 + третий индекс (k)

.....

VAR_PART = VAR_PART*dn + n-й индекс (m)

Информационные векторы

В некоторых языках верхняя и нижняя границы массивов известны

во время трансляции, поэтому компилятор может выделить память для

массивов и сформировать команды, ссылающиеся на элементы массива,

┌────┬────┬────┐

│ L1 │ U1 │ d1 │

├────┼────┼────┤

│ L2 │ U2 │ d2 │

│ . │ . │ . │ Описание массива

│ . │ . │ . │ A[L1:U1,...,Ln:Un]

│ . │ . │ . │

│ Ln │ Un │ dn │

├────┼────┴────┤

│ n │CONSTPART│

├────┴─────────┤

│ BASELOC │

└──────────────┘

Рис. . Информационный вектор для массива

используя верхние и нижние границы и постоянные значения d1,d2,..

.,dn. В других языках это невозможно т.к. границы могут

вычисляться во время счета. Поэтому нужен описатель для массива,

содержащий необходимую информацию. Этот описатель для массива

называется допвектор ( dope vector ) или информационный вектор.

Информационный вектор имеет фиксированный размер, который

известен при компиляции, следовательно, память для него может

быть отведена во время компиляции в области данных, с которой

ассоциируется массив. Память для самого массива не может быть

отведена до тех пор, пока во время счета не выполнится вход в

блок, и котором описан массив. При входе в блок вычисляются

границы массива и производится обращение к программе

распределения памяти для массивов. Здесь же вносится в

информационный вектор необходимая информация.

Какая информация заносится в информационный вектор? Для

предложенной выше n-мерной схемы нам как минимум нужны d2,...dn

и CONST_PART. Если перед обращением к массиву нужно проверять

правильность задания индексов, то следует также занести в

информационный вектор значения верхних и нижних границ.

5. Память для структур

Существует несколько альтернатив для определения новых

типов данных как структур, составленных из типов данных,

определенных ранее. Величины такого типа мы называем

структурными величинами. Существуют различные подходы к

реализации этих конструкций. Отличия обычно касаются следующих

вопросов:

Как выделять память для структурных величин?

Как строить структурные величины?

Как ссылаться на компоненту структурной величины?

Как освобождать память?

Записи по Хоору

Определение нового типа данных имеет вид

RECORD ( ,

, . . . , )

где каждая компонента имеет вид

Причем является одним из основных типов языка -

REAL, INTEGER, POINTER и т.д. Здесь во время компиляции известны

все характеристики всех компонент, включая тип данных, на которые

могут ссылаться указатели. Во время счета не нужны описатели ни

для самой структуры, ни для ее компонент, причем может быть

сгенерирована эффективная программа.

Любая структурная величина с n компонентами может храниться в

памяти в виде:

┌──────────────┬──────────────┬─────────┬──────────────┐

│ Компонента 1 │ Компонента 2 │ ... │ Компонента n │

└──────────────┴──────────────┴─────────┴──────────────┘

Поскольку при компиляции известны все характеристики, то

известен также объем памяти, необходимый для каждой компоненты,

и, следовательно, компилятор знает смещение каждой компоненты

относительно начала структурной величины. Для упрощения сбора

мусора лучше всего присвоить номер каждому типу данных ( включая

типы, определенные программистом) и иметь описатель для каждого

указателя. Описатель будет содержать номер, описывающий тип

величины, на которую в данный момент ссылается указатель.

Память для указателей и их описателей может быть выделена

компилятором в области данных, с которой они связаны; это не

трудно, так как они имеют фиксированную длину. Для хранения

текущих значений структурных величин может быть использована

отдельная статическая область данных и специальная программа для

выделения памяти в этой области. В рассматриваемых языках нет

явного оператора для освобождения памяти, так что, когда память

исчерпана, система обращается к программе "сбора мусора".

Заметим, что для того, чтобы иметь возможность обнаружить мусор,

нужно знать, где расположены все указатели, включая те, которые

являются компонентами структурных величин.

Структуры PL/1

Более сложную конструкцию имеют структуры, в которых

компоненты могут сами иметь подкомпоненты. Пример таких

структур - структуры языка PL/1. Такая структура есть дерево,

узлы которого связаны с именами компонент, а концевые узлы

имеют значения данных.

Если бы возможность иметь подкомпоненты была бы

единственным различием между записями по Хоору и структурами

PL/1 не было бы существенной разницы во время выполнения

программы; можно было бы разместить все компоненты и

подкомпоненты так, чтобы каждая имела фиксированное смещение

относительно начала структуры и это смещение было бы известно во

время компиляции. Однако в языке PL/1 существует еще два

расширения. С целью экономии памяти атрибут CELL для компоненты

требует, чтобы все ее подкомпоненты непременно занимали одно и

тоже место в памяти. В любое заданное время только одна из

нескольких переменных может иметь значение. Присваивание значения

подкомпоненте приводит к тому, что подкомпонента, к которой

обращались ранее утрачивает свое значение.

Подобная возможность вызовет осложнения во время компиляции,

но в действительности не очень изменяет код готовой программы,

если только объектная программа не должна проверять при каждом

обращении к подкомпоненте, что значение подкомпоненты

действительно существует.

Для другого расширения требуются более сложные

административные функции во время выполнения программы. В PL/1

корневой узел структурного дерева или любая из подкомпонент могут

быть снабжены размерностями.

Так как выражения, которые определяют границы изменения

индексов, должны быть вычислены при выполнении программы, для

них, как и в случае массивов, следует употреблятъ опители, или

информационные векторы. Т.е. нам необходимы информационные

векторы для всех компонент имеющих размерность большую единицы.

Структуры данных по Стендишу

Следующий шаг в развитии - структуры данных, которые не

могут быть реализованы эффективно, но которые богаче и мощнее.

Структуры данных предложенные Стендишом изменяются во время

работы программы. Динамически могут изменяться не только

размерности компонент, но и число компопонент и их типы.

Обычно во время компиляции ничего не известно, а все делается

во время выполнения программы на основе описателей, которые

сами строятся в это же время.

Во время выполнения программы необходимо хранить описатель

для каждой структурной величины. Действительно, этот описатель

аналогичен набору элементов таблицы символов, используемому

компилятором при компиляции, скажем, структур PL/1. Такие

описания структур лучше всего реализуются в виде дерева, где

для каждого узла должно быть по крайней мере известно:

1) концевой ли это узел или нет;

2) если узел концевой, то каков его тип;

3) если узел концевой, то указатель на значение, если

таковое существует;

4) если узел не концевой, то указатели на узлы для

подкомпонент;

5) размерности подкомпонент.

Всякий раз при обращении к значению компоненты должен быть

проинтерпретирован описатель. Начиная с корневого узла, находится

путь к узлу, к которому обращаются, проверяется тип этого узла и,

наконец, используется или изменяется его значение.

6. Соответствие фактических и формальных параметров

Рассмотрим различные типы формальных параметров и их

соответствие фактическим параметрам и покажем, как каждый из них

может быть реализован. Под формальным параметром мы понимаем

идентификатор в процедуре, который заменяется другим

идентификатором или выражением при вызове процедуры.

При обращении к процедуре, скажем, устанавливается некоторым

образом связь между формальными параметрами и фактическими

параметрами.

Когда в каком-нибудь языке происходит обращение к процедуре,

ей передается список адресов аргументов. Процедура переписывает

эти адреса в свою собственную область данных и использует их для

установления соответствия фактических и формальных параметров.

Кроме фактических параметров, часто имеется несколько неявных

параметров, о которых программист не знает. Один из них это,

конечно, адрес возврата. Следовательно, вызываемой процедуре

передается список такого вида:

неявный параметр 1

.

.

.

неявныи параметр m

адрес фактического параметра 1

.

.

.

адрес фактического параметра n

Что представляют собой адреса в списке? Это зависит от языка

и от типа параметра. Нише перечислены типы параметров, которые

мы будем рассматривать:

1) вызов по ссылке;

2) вызов по значению;

3) вызов по результату;

4) фиктивные аргументы;

5) вызов по имени;

6) имена массивов в качестве фактических параметров;

7) имена процедур в качестве фактических параметров.

Вызов по ссылке ( by reference )

Этот тип параметра самый простой для реализации.

Фактический параметр обрабатывается во время выполнения

программы перед вызовом; если он не является переменной или

константой, он вычисляется и запоминается во временной ячейке.

Затем вычисляется адрес ( переменной, константы или временной

ячейки ), и этот адрес передается вызываемой процедуре.

Вызываемая процедура использует его для ссылки на ячейку (ячейки),

содержащую значение.

Вызов по значению ( by value )

При этом типе соответствия формального и фактического

параметров вызываемая процедура имеет ячейку, выделенную в ее

области данных для значения формального параметра этого типа. Как

и при вызове по ссылке, адрес фактического параметра вычисляется

перед вызовом и передается вызываемой процедуре в списке

параметров. Однако перед фактическим началом выполнения процедура

выбирает значение по адресу и заносит его в свою собственную

ячейку. Эта ячейка затем используется как ячейка для величины

точно так же, как любая переменная, локализованная в процедуре.

Таким образом, нет никакого способа изменить в процедуре значение

фактического параметра.

Вызов по результату ( by result )

В языке АЛГОЛ W для любого формального параметра Х,

объявленного параметром RESULT, справедливо следующее:

1. Для параметра Х отводится ячейка в области данных

процедуры. Эта ячейка используется в процедуре как локализованная

ячейка для переменной Х.

2. Как и в случае параметра VALUE, при рызоре при вызове

процедуры вычисляется и передается адрес фактического параметра.

3. Когда выполнение процедуры заканчивается, полученное

значение Х запоминается по адресу, описанному в п.2.

Другими словами, параметр RESULT есть переменная,

локализованная в процедуре, значение которой при выходе

запоминается в соответствующем фактическом параметре (который

должен быть конечно, переменной ). Понятие RESULT было

предназначено для того, чтобы дополнить в АЛГОЛе вызов по имени

( который описан ниже ), так как последний весьма неэффективен и

обладает большими возможностями, чем это необходимо в

большинстве случаев.

Фиктивные аргументы

В развитых языках следующие фактические параметры

обрабатываются по-разному:

1) константы;

2) выражения, которые не являются переменными;

З) переменные, чьи характеристики отличаются от характеристик

указанных для соответствующих формальных параметров.

Для такого фактического параметра в вызывающей процедуре

заводится временная переменная. Фактический параметр вычисляется

и запоминается во временной переменпой, и адрес этой переменной

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5209
Авторов
на СтудИзбе
430
Средний доход
с одного платного файла
Обучение Подробнее