Преимущество / Недостаток указателей на функции - PullRequest
1 голос
/ 09 августа 2011

Так что проблема, с которой я столкнулся, еще не возникла. Я планирую некоторый код для игры, над которой я сейчас работаю, и я знаю, что мне понадобится максимально сэкономить использование памяти с первого шага.

Мой вопрос, если у меня есть, например, 500 тыс. Объектов, которые нужно постоянно конструировать и деконструировать. Будет ли это сэкономить мне память, чтобы иметь функции, которые эти классы будут использовать в качестве указателей на функции.

например. без функциональных указателей
class MyClass
{
public:
void Update();
void Draw();
...
}

например с функциональными указателями

class MyClass
{
public:
void * Update;
void * Draw;
...
}

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

1 Ответ

1 голос
/ 09 августа 2011

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

Первый пример

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

Не виртуальные функции-члены в основном являются статическими функциями, принимающими указатель this.

Преимущество состоит в том, что ваши объекты действительно просты, и у вас будет только одно место, где можно найти соответствующий код.

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

Второй пример

Вы выделяете 2x указателя на экземпляр объекта.Обычно указатели имеют размер от 4x до 8x байт (в зависимости от вашей целевой платформы и вашего компилятора).

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

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

Другие параметры

Использование указателей на функции таким специфическим способом (элементы данных экземпляра) обычноимеет больше смысла в простом C и меньше смысла в C ++.

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

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

Вам также не придется инициализировать эти указатели на функции -система типов C ++ будет выполнять эквивалентную инициализацию автоматически (путем создания v-таблицы и инициализации указателя v-таблицы каждого экземпляра).

См .: http://www.parashift.com/c++-faq-lite/virtual-functions.html

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