Объем памяти моего приложения delphi - PullRequest
3 голосов
/ 02 декабря 2010

У меня большое приложение на Delphi, и я пытаюсь сохранить объем памяти на низком уровне.

В моей программе я использую компонент (Taco) и компонент (TBurrito), который наследуется от Taco. Теперь, что касается использования памяти классами, а не фактическими экземплярами, какой сценарий использует больше памяти?

A. Использование всего лишь компонента TBurrito

или

B. Использование комбинации компонентов Taco и TBurrito?

Моя мысль состоит в том, что, поскольку TBurrito наследует Taco, класс Taco уже хранится в памяти, и, следовательно, его использование не увеличит объем памяти.

* Примечание. На самом деле названия компонентов не Taco и Burrito.

Ответы [ 2 ]

6 голосов
/ 02 декабря 2010

Каждый экземпляр Burrito будет занимать как минимум столько же памяти, сколько экземпляр Taco. Вычтите Taco.InstanceSize из Burrito.InstanceSize, чтобы узнать, сколько еще.

Использование Burrito исключительно не сэкономит вам памяти; определение Taco все еще будет существовать, даже если у вас нет экземпляров этого точного класса, потому что, по крайней мере, Burrito.ParentClass все еще должно ссылаться на него.

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

4 голосов
/ 02 декабря 2010

Классы просто используют память для своих VMT. Пока вы на самом деле не создаете экземпляр класса, он занимает не пространство, а для VMT, и для каждого класса существует только один VMT. Размер VMT зависит только от того, сколько виртуальных методов на самом деле имеет класс, потому что для каждого виртуального метода есть одна запись. Статические методы разрешаются во время компиляции и не используют пространство памяти. Другие данные VMT имеют фиксированный размер (хотя могут отличаться в разных версиях Delphi). Динамические методы были введены, чтобы держать VMT меньше. Это потому, что наследование класса создаст новый VMT со всеми «слотами» виртуальных методов родительского класса, а также наследуемых классов. Динамические методы используют код диспетчеризации во время выполнения для поиска вызываемого метода. Поскольку они несколько медленнее, их использование было предложено только для классов, которые переопределяют только несколько методов очень больших родительских классов. Если с памятью нет проблем, нет причин использовать их. То, что также может использовать пространство памяти, - это информация RTTI, хотя я никогда не выясняю, где они хранятся. В любом случае, если вы используете дочерний класс, его родительский VMT также должен быть необходим, потому что дочерний класс может вызывать унаследованные. Но если вы используете очень большой класс с большим количеством виртуальных методов и несколькими экземплярами, я думаю, что большая часть памяти, используемой вашим приложением, будет принадлежать экземплярам класса, а не классам VMT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...