C ++ и QT4.5 - проходит ли const int & overkill? Помогает ли проход по ссылке в сигналах / слотах? - PullRequest
8 голосов
/ 26 августа 2009

Здесь два вопроса в одном ...

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

void processSomething(const int& value);

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

Второй вопрос, ну, по вопросу передачи по ссылке, в механизме слотов / сигналов QT, помогает ли передача по ссылке предотвратить копирование объектов, как при обычном вызове функции?

Ответы [ 3 ]

19 голосов
/ 26 августа 2009

Да, это излишне и фактически приведет к более медленному коду, чем если бы вы передали int по значению. Int - это четыре байта; ссылка (по существу, адрес памяти) также либо четыре байта (на 32-битной машине), либо восемь байтов (на 64-битной машине). Таким образом, вам, возможно, потребуется передать больше информации в функцию - и, кроме того, у вас есть издержки на разыменование этой ссылки.

Однако, если вы передаете что-то большее, чем int, более эффективно использовать константную ссылку, потому что вы можете передать только четыре или восемь байтов вместо того, чтобы копировать весь объект.

Редактировать Относительно Qt: Да, если слот принимает постоянную ссылку на объект, то причина этого заключается в том, чтобы сэкономить накладные расходы на копирование объекта.

7 голосов
/ 26 августа 2009

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

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

4 голосов
/ 26 августа 2009

Первый - разница между

  • void processSomething (const int & value);
  • void processSomething (int value);

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

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

С точки зрения производительности - передача константной ссылки на int может (или не может) выполняться медленнее, в зависимости от компилятора и оптимизации. Компилятор может (теоретически) оптимизировать передачу ссылки const на передачу по значению, хотя я не знаю, так ли это. Работа с указателями на целые вместо значений медленнее, конечно.

Подробнее об этом см .: Когда использовать указатели, а когда не использовать их


После прочтения другого связанного поста - компилятор не может оптимизировать его в многопоточной среде. По крайней мере, в MT-среде существуют реальные различия между вызовами const int & и int. +1 за эту ссылку.

...