Будет ли конструктор копирования не по умолчанию замедлять мою программу? - PullRequest
0 голосов
/ 21 декабря 2011

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

1 Ответ

2 голосов
/ 21 декабря 2011

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

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

Если у вашего класса есть указатели, то один из подходов - обернуть их в какой-нибудь умный указатель. Например, если вместо SDL_Surface* вы используете std::shared_ptr<SDL_Surface> (или boost::shared_ptr<SDL_Surface>, что совпадает), вы разрешаете копирование этого указателя. Класс shared_ptr будет хранить счетчик ссылок на нем и удалять поверхность только тогда, когда все ссылки исчезнут. Обратите внимание, что если вы используете этот подход, вам нужно использовать пользовательскую функцию удаления для SDL_Surface, как показано в этот вопрос .

...