![]() |
|
Модераторы: volvo877, Snowy, MetalFan |
![]()
|
|
| pil69 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.12.2007 Репутация: нет Всего: нет |
Имеется код
Выполняю и через 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 |
|||
|
||||
| Virtuals |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: нет Всего: 11 |
смотрите размер каждой переменной в помощьи, а так-же настройки компилятора по оптимизации, и ВЫРАВНИВАНИЮ переменных в памяти
виндовс глубоко наплевать на типы данных паскаля, она о них не знает Это сообщение отредактировал(а) Virtuals - 31.3.2008, 20:10 |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: нет Всего: 128 |
-------------------- There are always someone smarter than you... |
|||
|
||||
| pil69 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 двоичных разряда).". То есть Паскаль не совсем корректно отображает значения указателей. |
|||
|
||||
| Dobermann |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 992 Регистрация: 7.1.2008 Репутация: нет Всего: 0 |
1) Блин, парень кто тебя так учил работать с указателями.........
Заданные тобой переменные - это указатели ссылающиеся на адреса ячеек памяти.
2) Хочешь чтобы не было расстояния между сигментами используй массив. и 3) не тупи с директивой! В состоянии $N+, компилятор генерирует код для выполнения всех вещественных вычислений с использованием математического сопроцессора 80x87 и дает вам доступ к четырем дополнительным вещественным типам: Single, Double, Extended и Comp |
|||
|
||||
| pil69 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 13.12.2007 Репутация: нет Всего: нет |
А меня и интересовали указатели p, p1, p2, а не ссылочные переменные p^, p1^, p2^ (см. название темы)
Директиву $N+ вставил для Extended Это сообщение отредактировал(а) pil69 - 3.4.2008, 11:02 |
|||
|
||||
| Dobermann |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 992 Регистрация: 7.1.2008 Репутация: нет Всего: 0 |
Тогда чем тебя не устраивает вывод?!!!
|
|||
|
||||
| Bug_Hunter |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 19.2.2008 Где: Бл. Подмосковье Репутация: нет Всего: нет |
Windows здесь не при чем. Независимо от того, запущен Турбо Паскаль из под Дос или в сеансе Дос под Виндоус, его исполняющая система забирает себе всю доступную в реальном режиме динамическую память (или ее часть, если задано ограничение директивой {$M ...}), а затем встроенный менеджер памяти Турбо Паскаля распределяет ее атомами с размером, кратным 8-ми байт. Т.о. для переменных типа char, shortint, integer, longint, real будет выделятся по 8 байт, а для переменной типа extended - 16 байт. Лишние байты в атоме при этом просто не используются, но они не являются свободными участками памяти, менеджер памяти считает лишние байты атома занятыми участками памяти. Не между сегментами, а между параграфами. Это максимальный размер сегмента в сегментной модели памяти ограничен величиной 64 килобайт, минимальный размер сегмента - 16 байт (один параграф), а начинаться сегмент может с любой границы параграфа, т.е. с адреса, кратного 16-ти. Но это если памятью управляет менеджер памяти Дос. А Турбо Паскаль, повторюсь, использует свой менеджер памяти, который нарезает память кусками с размером, кратным 8-ми байт и начинаются эти куски с адресов, кратных 8-ми байтам. Ку? |
|||
|
||||
![]()
|
| Правила форума "Delphi" | |
|
|
Запрещается! 1. Обсуждать и делится взломанными компонентами или программным обеспечением 2. Публиковать ссылки на варез 3. Оффтопить
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |