Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2010, 04:50   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Размер объекта

Известно, что со смещением -4 от указателя на динамические данные хранится их размер. Пишу:
Код:
  ShowMessage (IntToStr (PInteger (Integer(Form1) - 4)^));
  ShowMessage (IntToStr (Form1.ClassType.InstanceSize));
В итоге, первое сообщение 770, второе 764. Разница 6 байт.
4 байта ушли на указатель на класс. Ни как не могу понять, откуда еще 2 байта?

Добавленно --------------------------------------------------------------
Или так:
Код:
  TMyObject = class
  private
    F1: array [0..1] of Byte;
  protected
  public
  end;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  o: TMyObject;
begin
  o := TMyObject.Create;
  ShowMessage (IntToStr (PInteger (Integer(o) - 4)^));
  ShowMessage (IntToStr (o.ClassType.InstanceSize));
  o.Free;
end;
PInteger (Integer(o) - 4)^)) = 14
o.ClassType.InstanceSize = 8 (это понятно, выделяется порциями)
Опять 14 - 8 = 6
Но если
Код:
  TMyObject = class
  private
  protected
  public
  end;
PInteger (Integer(o) - 4)^)) = всеравно 14 о_О
o.ClassType.InstanceSize = 4

Последний раз редактировалось Sibedir; 21.12.2010 в 05:23.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 13:14   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Вопрос еще актуален:
Почему GetMem(s) выделяет минимум 14 байт (не кратно 4), а при увеличении s добавляет порции по 4Б? При этом разница между реально выделенной памятью и s всегда => 6. На что резервируются эти 6 байт.
На сколько я понял, в конце выделенного участка есть ссылка на следующий выделенный участок (как в динамическом списке). Но это 4 байта а не 6.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 13:18   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

скорее всего до 14-ти еще два байта на чтото заняты, вообще посмотрите адреса, может 14 и идет до выравнивания на 4.
Цитата:
а при увеличении s добавляет порции по 4Б?
ну это итак понятно ибо выравнивание.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.12.2010, 13:20   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Фрагментация. Если хранить данные с точностью до байта, то накладные расходы на управляющую информацию могут перевесить реальные данные.

Иными словами, это делается по той же причине, почему файловая система хранит файлы кластерами.

На прикладном уровне в управлении памятью считается нормальным не более чем двукратное превышение выделенной памяти над запрошенной. (прежде чем начать возмущаться по поводу "ай как много памяти пропадает", вспомните правило trade size for speed и рассмотрите любой сценарий с SetLength).

P.S. Понятно, что реальна картина выделения памяти зависит от того, какой менеджер памяти используется.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.12.2010, 13:24   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Иными словами, это делается по той же причине, почему файловая система хранит файлы кластерами.
Да, я знаю. Не могу вкурить откуда 6. Не 4, не 8, а 6. он же не кратен 4-м. Откуда взялось такое смещенное выравнивание?

P.S.:
Осторожно, тема - кондидат на холивар.
Не хотелось бы.

Последний раз редактировалось Sibedir; 22.12.2010 в 13:27.
Sibedir вне форума Ответить с цитированием
Старый 22.12.2010, 13:25   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Да, я знаю. Не могу вкурить откуда 6.
В каком смысле? Это волшебное число.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 22.12.2010, 13:29   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Смешно
Но не понятно
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как определить размер скрытого объекта? rolling JavaScript, Ajax 7 28.09.2009 19:39
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Как поменять одну из текстур объекта не меняя все остальные и без повторной загрузки объекта в GLScene DomKr@t Мультимедиа в Delphi 0 14.12.2008 01:52
Изменить размер объекта Comment Васкинс Microsoft Office Excel 4 16.07.2008 14:11
Как найти размер объекта Sibedir Общие вопросы Delphi 12 21.11.2007 06:17