Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 03.04.2017, 00:48   #1
Заблокирован
 Сержант
Аватар для craft1n
 
craft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражанияcraft1n блестящий пример для подражания
Регистрация: 02.08.2016
Сообщений: 124
Популярность: 1739
Сказал(а) спасибо: 2
Поблагодарили 4 раз(а) в 4 сообщениях
Отправить сообщение для craft1n с помощью Skype™
 
Post Как сэкономить память в ваших программах

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

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

· boolean, char and byte = 1 байт
· smallInt, word, wordbool = 2 байт
· string, pointers, longint, integer = 4 байт
Теперь давайте посмотрим на объявление класса в нашем исходном коде:

Код:
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 байт на каждом экземпляре данного класса). Конечно же это не большая экономия памяти, но в тех случая, когда класс инициализируется многократно либо класс довольно велик, то такая экономия довольно ощутима.


Взято с [Ссылки могут видеть только зарегистрированные пользователи. ]

Последний раз редактировалось craft1n; 03.04.2017 в 01:33.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Прочее] Как сэкономить на покупке игры в Steam SanicX Халява для Читера 5 15.02.2014 05:51
Текст в программах СоскаМпосмотрит Общение и обсуждение CrossFire 1 11.12.2011 21:11
Новые сервера в моих программах + еще кое что V.I.R.U.S. Общение и обсуждение 7 12.07.2011 14:49
[Информация] Обход капчи в некоторых программах CaHeK1993 Баги игр ВКонтакте 1 20.06.2011 08:15

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 01:05.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net