Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Выделение места в динамической памяти


Автор: pil69 31.3.2008, 01:55
Имеется код
Код

{$N+}
var p,p1,p2:^shortint;
 begin
  new(p);
  p^:=2;
  writeln(p^);
  new(p1);
  p1^:=2;
  writeln(p1^);
    new(p2);
  p2^:=2;
  writeln(p2^)
 end.

Выполняю и через debug/watch проверяю значения p, p1, p2.
Они равны, соответственно
Ptr($4C34,$0)
Ptr($4C34,$8)
Ptr($4C35,$0)
Меняю тип на ^Integer. Результат тот же. Другие типы также ситуацию не меняют. 
Лишь ^Extended дает
Ptr($4C34,$0)
Ptr($4C35,$0)
Ptr($4C36,$0)
Вопрос у меня возник такой. В динамической памяти ОС Windows выделяет место для разных типов одинакового размера по 8 байтов (кроме Extended), или же каждому типу по их "потребностям" (byte, shortint - 1 байт, integer - 2 байта и т.д.), но при этом появляются участки свободной памяти между переменными p, p1, p2? Между сегментами расстояние по 16 байт, хотя в учебниках утверждается, что должно быть 64 байта. У кого есть предположения по этому поводу?

Автор: Virtuals 31.3.2008, 20:08
смотрите размер каждой переменной в помощьи, а так-же настройки компилятора по оптимизации, и ВЫРАВНИВАНИЮ переменных в памяти
виндовс глубоко наплевать на типы данных паскаля, она о них не знает

Автор: MetalFan 1.4.2008, 13:17
Цитата(pil69 @  31.3.2008,  01:55 Найти цитируемый пост)
Имеется код

используй для оформления кода кнопку "код"!

Автор: pil69 1.4.2008, 14:23
В работе Габрельяна Б.В."Динамическое распределение памяти в MS Windows"
(http://window.edu.ru/window/library?p_rid=45303) нашел раъяснение:
"Семейство ОС MS Windows 9x/Me и, тем более, MS Windows NT/2000/XP
поддерживают не сегментированную, "плоскую" модель памяти. Весь
(виртуальный) адрес вырождается в смещение, но это смещение 4-х байтовое (32
двоичных разряда)."
. То есть Паскаль не совсем корректно отображает значения указателей.

Автор: Dobermann 1.4.2008, 17:06
1) Блин, парень кто тебя так учил работать с указателями.........
Заданные тобой переменные - это указатели ссылающиеся на адреса ячеек памяти.
Цитата

Выполняю и через debug/watch проверяю значения p, p1, p2.
 вот ты и смотришь на память, а не "на значения в памяти"
2) Хочешь чтобы не было расстояния между сигментами используй массив.
и 3) не тупи с директивой!
В состоянии $N+, компилятор генерирует код для выполнения всех вещественных
вычислений с использованием математического сопроцессора 80x87 и дает вам
доступ к четырем дополнительным вещественным типам: Single, Double, Extended
и Comp

Автор: pil69 2.4.2008, 11:58
А меня и интересовали указатели p, p1, p2, а не ссылочные переменные p^, p1^, p2^ (см. название темы)  
 Директиву $N+ вставил для Extended 

Автор: Dobermann 3.4.2008, 17:01
Тогда чем тебя не устраивает вывод?!!!

Автор: Bug_Hunter 8.4.2008, 23:03
Цитата(pil69 @  31.3.2008,  01:55 Найти цитируемый пост)
Вопрос у меня возник такой. В динамической памяти ОС Windows выделяет место для разных типов одинакового размера по 8 байтов (кроме Extended), или же каждому типу по их "потребностям" (byte, shortint - 1 байт, integer - 2 байта и т.д.), но при этом появляются участки свободной памяти между переменными p, p1, p2? 

Windows здесь не при чем.  Независимо от того, запущен Турбо Паскаль из под Дос или в сеансе Дос под Виндоус, его исполняющая система забирает себе всю доступную в реальном режиме динамическую память (или ее часть, если задано ограничение директивой {$M ...}), а затем встроенный менеджер памяти Турбо Паскаля распределяет ее атомами с размером, кратным 8-ми байт. Т.о. для переменных типа char, shortint, integer, longint, real будет выделятся по 8 байт, а для переменной типа extended - 16 байт. Лишние байты в атоме при этом просто не используются, но они не являются свободными участками памяти, менеджер памяти считает лишние байты атома занятыми участками памяти.

Цитата(pil69 @  31.3.2008,  01:55 Найти цитируемый пост)
Между сегментами расстояние по 16 байт,

Не между сегментами, а между параграфами.

Цитата(pil69 @  31.3.2008,  01:55 Найти цитируемый пост)
хотя в учебниках утверждается, что должно быть 64 байта.

Это максимальный размер сегмента в сегментной модели памяти ограничен величиной 64 килобайт, минимальный размер сегмента - 16 байт (один параграф), а начинаться сегмент может с любой границы параграфа, т.е. с адреса, кратного 16-ти. Но это если памятью управляет менеджер памяти Дос. А Турбо Паскаль, повторюсь, использует свой менеджер памяти, который нарезает память кусками с размером, кратным 8-ми байт и начинаются эти куски с адресов, кратных 8-ми байтам.

Ку?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)