Вопрос

Существует ли случай, когда проходные ссылки дороже, чем прохождение в C ++? Если так, каким был бы этот случай?

Это было полезно?

Решение

Предпочитают проходить примитивные типы (int, char, float, ...) и структуры стручков, которые дешевы для копирования (точка, комплекс) по значению.

Это будет более эффективным, чем косвенный, требуемый при прохождении ссылки.

Видеть Черты звонка Boost.

Класс шаблонов call_traits<T> Инкапсулирует «лучший» метод для передачи параметра некоторого типа T к функции или из функции, и состоит из набора типов, определенных в таблице ниже. Цель call_traits Соответствует, чтобы такие проблемы, как «ссылки на ссылки», никогда не возникают, и что параметры передаются наиболее эффективным способом.

Другие советы

Вы можете прочитать эту статью "Хотите скорость? Пройти по значению" О копировании Elision и RVO (возврат оптимизацией значений). Это объясняет, что ссылки иногда мешают компилятору их делать.

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

Компилятор мог бы оптимизировать передачу примитивного типа, ссылаясь на простое прохождение по значению, если тип одинакового размера или меньше, чем размер эталонного/указателя. Нет никакой гарантии, что компилятор сделает это, поэтому, если у вас есть выбор, проходите примитивные типы по стоимости. В шаблоне, однако, вам часто приходится проходить через ссылку - рассмотрите Vector's push_back, который принимает константу. Если у вас есть вектор INT, вы будете передавать ссылку на примитивный тип. В этой ситуации вы надеетесь, что компилятор оптимизирует это, заменив ссылку на значение. Поскольку вектор может хранить большие типы, принятие ссылки CONST является лучшим выбором.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top