Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение места в динамической памяти, Объем выделяемой памяти одинаков? 
:(
    Опции темы
pil69
Дата 31.3.2008, 01:55 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



Имеется код
Код

{$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 байта. У кого есть предположения по этому поводу?

Это сообщение отредактировал(а) pil69 - 1.4.2008, 14:04
PM MAIL   Вверх
Virtuals
Дата 31.3.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: нет
Всего: 11



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

Это сообщение отредактировал(а) Virtuals - 31.3.2008, 20:10
PM MAIL ICQ   Вверх
MetalFan
Дата 1.4.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: нет
Всего: 128



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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
pil69
Дата 1.4.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



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

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

PM   Вверх
pil69
Дата 2.4.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 13.12.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) pil69 - 3.4.2008, 11:02
PM MAIL   Вверх
Dobermann
Дата 3.4.2008, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Тогда чем тебя не устраивает вывод?!!!
PM   Вверх
Bug_Hunter
Дата 8.4.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 19.2.2008
Где: Бл. Подмосковье

Репутация: нет
Всего: нет



Цитата(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-ми байтам.

Ку?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

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

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.