Память занята функциями - PullRequest
       2

Память занята функциями

3 голосов
/ 10 декабря 2010

У меня есть класс Voxel, который создается полмиллиона раз. Я сократил объем используемых данных, но мне просто пришло в голову, что я не уверен, занимают ли функции память таким же образом, как переменные. Как узнать, сколько места занимает функция в моей программе? Что еще более важно, когда у меня есть 500 экземпляров класса, означает ли это, что у меня есть 500 экземпляров функции?

Я могу предположить, что это, скорее всего, не тот случай (без учета встроенных функций), но объяснение было бы неплохо.

Ответы [ 4 ]

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

Не паникуйте.Код для большинства функций (inline или нет) встречается только один раз в связанном двоичном файле.

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

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

Для Visual Studio убедитесь, что вы включили генерация кода времени соединения , поскольку это может еще больше уменьшить размер кода путем проверки полной функции, установленной в ссылке-time, а также обычные оптимизации времени компиляции , которые вы уже должны были максимально использовать.Вы также можете использовать / OPT: REF во время соединения, чтобы опустить функции без ссылок.Это значение по умолчанию для сборок Release, но его стоит проверить дважды.

3 голосов
/ 10 декабря 2010

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

Определение размера кода функции нетривиально.Генерация карты ссылок является наиболее общим средством определения размера функции, но для ее чтения требуется некоторое обучение.

2 голосов
/ 10 декабря 2010

Если у вас нет виртуальных функций в этом классе - нет, функции-члены не занимают места в экземпляре класса. С виртуальными функциями каждый экземпляр имеет единственный указатель на таблицу виртуальных функций .

1 голос
/ 10 декабря 2010

Что занимает место при создании нового объекта, так это данные объекта, а не машинный код операций с этими данными - если вы хотите, вы можете думать о функциях-членах как о «обычных», свободных функциях, которые неявно передаются указатель this.

Например, с точки зрения codegen, разница между

невелика
struct A { int x; void foo(); };

и

struct A {};
void foo( A* self );

.

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

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