Задать вопрос
@semenyakinVS
Писатель кода и не только

Нужно ли оптмизировать использование временных врапперов?

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

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

Я слышал что есть подход, при котором мы создаём глобальные объекты, служащие для передачи оборачиваемых данных. Вопрос состоит в следующем: действительно ли используется такой подход и если да, то как его максимально корректно реализовать на С++?

Как я сейчас вижу такое решение

Тупое решение в лоб:

template< typename T_ObjectType >
T_ObjectType &registerObject() {
static T_ObjectType sRegister;
return sRegister;
}

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


П.С.: Семантика перемещения, как я понимаю, тоже не подходит. Во-первых, она вызов деструктора не отменяет. Во-вторых, я стараюсь писать без использования С++11 - для возможности использования библиотеки на старых компиляторах.

Заранее спасибо всем за ответ!
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@MiiNiPaa
требует вызова лишнего деструктора
Это так страшно и сильно бьёт по производительности в вашем случае? В случае перемещения деструктор перемещённого объекта в общем случае ничего не должен делать.

Также можно передавать безымянный временный объект в функцию и включить оптимизации: должно произойти copy elision
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы