Почему ссылки на const необходимы, чтобы избежать копирования параметров - PullRequest
3 голосов
/ 16 августа 2011

Согласно Википедии , вызовы функций не копируют параметры с references в const тип:

void f_slow(BigObject x);
void f_fast(const BigObject& x);

f_slow(y); // slow, copies y to parameter x
f_fast(y); // fast, gives direct read-only access to y

Почему ссылка должна быть const? Разве не-1009 * ссылка не может сделать то же самое:

void f_should_be_fast(BigObject& x);

Ответы [ 7 ]

8 голосов
/ 16 августа 2011

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

7 голосов
/ 16 августа 2011

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

Обратите внимание, что, возможно, также стоит прочитать это: Хотите скорость? Передача по значению

1 голос
/ 16 августа 2011

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

1 голос
/ 16 августа 2011

Со ссылкой на неконстантный вы не можете передать объект const (или ссылку на константный объект) в функцию, и это приведет к ухудшению правильности констант. Однако это не повлияет на скорость выполнения.

0 голосов
/ 16 августа 2011

Использование константной ссылки дает вам Константа правильности .
В двух словах:

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

Это помогает честным программистам совершать честные ошибки и предоставляет компилятору возможность выполнить любую оптимизацию (вообще) для любого.

0 голосов
/ 16 августа 2011

Ссылка в этом случае просто неизменяемая из-за того, что она квалифицируется как const . Не квалифицируя это const , это просто изменяемая ссылка. Единственная проблема заключается в том, является ли ссылочный аргумент изменяемым или нет. Скорость не имеет ничего общего с квалификацией const , AFAIK.

0 голосов
/ 16 августа 2011

Да, это будет то же самое, но const - это сигнал для компилятора, который может оптимизировать объект, который никогда не будет изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...