Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  98

•  TDictionary Custom Sort  3 297

•  Fast Watermark Sources  3 045

•  3D Designer  4 801

•  Sik Screen Capture  3 296

•  Patch Maker  3 515

•  Айболит (remote control)  3 613

•  ListBox Drag & Drop  2 971

•  Доска для игры Реверси  81 426

•  Графические эффекты  3 900

•  Рисование по маске  3 212

•  Перетаскивание изображений  2 595

•  Canvas Drawing  2 715

•  Рисование Луны  2 541

•  Поворот изображения  2 148

•  Рисование стержней  2 151

•  Paint on Shape  1 557

•  Генератор кроссвордов  2 214

•  Головоломка Paletto  1 755

•  Теорема Монжа об окружностях  2 194

•  Пазл Numbrix  1 676

•  Заборы и коммивояжеры  2 047

•  Игра HIP  1 271

•  Игра Go (Го)  1 219

•  Симулятор лифта  1 463

•  Программа укладки плитки  1 206

•  Генератор лабиринта  1 535

•  Проверка числового ввода  1 341

•  HEX View  1 481

•  Физический маятник  1 348

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Как сэкономить память в программах



Что общего между морской свинкой и женщиной-программистом?
То, что морская свинка - она и не свинка, и не морская.

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

Но сначала обратимся к основам типов данных, используемых в Delphi, и детально рассмотрим - сколько байт памяти занимает каждый тип данных:

1 байт
boolean, char and byte
2 байт
smallInt, word, wordbool
4 байт
string, pointers, longint, integer

Теперь давайте посмотрим на объявление класса в нашем исходном коде:


TMyClass = class
  private
    field1: char;
    field2: longint;
    field3: boolean;
    field4: string;
    field5: byte;
    field6: integer;
  public
    procedure proc1;
end;

теперь просуммируем байты, которы занимает каждый тип данных. По идее должно получиться 15 байт, но на самом деле это не так. Реальный размер, занимаемый данным экземпляром класса будет составлять 24 байта, т. е. 4 байта на каждое поле. Почему ? Потому что поумолчанию в Delphi, по правилам оптимизации, каждое поле располагается от предыдущего со сдвигом на 4 байта: field1 занимает 1 байт, поидее поле field2 должно следовать сразу же за field1, но по правилам оптимизации, остаются 3 байта не содержащие никакой информации, а следовательно напрасно потерянные. А если бы field2 был бы длиной в 1 байт или 2 байта, то он был бы помещён сразу же за полем field1, потому что это не нарушает правил оптимизации.

Какой же напрашивается вывод ? А если изменить порядок объявления переменных в классе ? Я просто сгруппировал переменные по их размеру (байтовому): вместе все однобайтовые, соответственно вместе все двухбайтовые и т.д.

Вот так стал выглядеть наш класс:


TMyClass = class
  private
    field1: char;
    field3: boolean;
    field5: byte;
    field2: longint;
    field4: string;
    field6: integer;
  public
    procedure proc1;
end;

С такой организацией классы, его длина стала 16 байт (сэкономили 8 байт на каждом экземпляре данного класса). Конечно же это не большая экономия памяти, но в тех случая, когда класс инициализируется многократно либо класс довольно велик, то такая экономия довольно ощутима.








Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте