Как ответили в этом вопрос Чарльз Бэйли, передача по постоянной ссылке должна учитываться, когда тип объекта большой, но какой тип объекта считается большим?
РЕДАКТИРОВАТЬ:
Хорошо, чтобы предоставить больше данных, которые можно было бы использовать для предоставления более конкретного ответа, я решил добавить к этому описанию реальную проблему.
Предположим, у нас есть такой объект:
typedef struct dipl {
quint16 __id;
quint16 __pos;
quint16 __len;
} data;
И у нас есть еще один объект, подобный этому:
class bidipl
{
public:
bidipl();
quint8 id();
void setid(quint8 __id);
void appenddipl(dipl __dipl);
private:
qint8 _M_id;
dipllist _M_dipllist;
};
куда dipllist
является typedef QList<dipl> dipllist;
, Объекты dipl
а также bidipl
создаются один раз, но доступны более 100 раз в минуту. Так как мы должны пройти dipl
к нашей функции добавления?
void appenddipl(dipl __dipl);
Или же
void appenddipl(const dipl& __dipl);
Что следует считать достаточно большим, чтобы оправдать передачу по ссылке, а не по стоимости? Вы найдете ответы, варьирующиеся от:
std::pair<int, int>
должны быть переданы по ссылке.в
vectors
, strings
)Мой личный вкус: примитивные данные по значению, структуры по ссылке.
Единственный продуктивный ответ вы найдете, профилировав конкретное приложение на конкретной архитектуре. Любой разговор о производительности без фактического профилирования напрасен.
С передачей объектов по значению связаны две отдельные затраты: копирование представления данных и выполнение конструкторов. Вы должны учитывать стоимость обоих.
Копирование данных обычно выполняется быстро, но не забывайте о причинах. Это нормально, чтобы пройти struct { int[7]; }
по стоимости, но, вероятно, не так много для struct { int[20000]; }
,
Исполнительные конструкторы могут выполнять динамическое распределение, что создает риск исключений и стоимость синхронизации. Это может быть незначительным, или это может быть важно. Это зависит.
Единственные переменные, которые вы, вероятно, должны безоговорочно передавать по значению, это переменные встроенного типа. Для всего остального вы должны подумать о компромиссах.
Как сказал Чарльз, когда рассматриваемое значение имеет размер, равный или меньший, чем размер ссылки на объект, существует очевидный выигрыш в производительности для простой передачи значения вместо ссылки. Тем не менее, поскольку доступ к значению МОЖЕТ потребовать операции разыменования, в зависимости от деталей контекста и того, насколько «умным» является компилятор, возможно, все же «стоило бы» передать значение, размер которого немного больше, чем ссылка. Однако, это начинает раскалывать волосы и редко бывает значительным.
Все, что не является фундаментальным типом, подразумевает любой объект класса, структуру или контейнер