Вопрос

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

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

A. Использование только компонента Tburrito повсюду

или

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

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

*Примечание - имена компонентов на самом деле не тако и буррито.

Это было полезно?

Решение

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top