Подтвердить что ты не робот

В С++, плохо ли передавать const bool по ссылке?

В практической среде, используя gcc или MS Visual Studio, плохо ли передавать типы значений, которые имеют тот же размер или меньше, чем int по ссылке const?

то есть. плохо написать такую ​​функцию:

void f(const bool& b);

или

void f(const char& c);

а не:

void f(bool b);

или

void f(char c);

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

4b9b3361

Ответ 1

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

В стандарте не указывается, как должны быть реализованы ссылки, но на практике компиляторы реализуют ссылки с помощью указателей. Поэтому в общем случае a bool& будет реализован с помощью bool*, что означает, что для доступа к bool вам нужно разыменовать дополнительный указатель каждый раз. Так как a bool не больше, чем указатель, для уменьшения этого недостатка нет уменьшенного объема памяти или менее байтового копирования.

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

Ответ 2

Производительность в стороне, на самом деле есть случаи, когда вы получите другое поведение.

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

Кроме того, определение интерфейса ограничивает то, что вы можете сделать с переменной внутри функции. Рассмотрим этот пример:

int foo(int a) {
    a = 5; // valid
}

int bar(const int& a) {
    a = 5; // compiler-error
}

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

Ответ 3

Одна из причин заключается в том, что вы хотели бы передать другим программистам, что значение является постоянным, оно может в некоторых случаях быть более четким, хотя достаточно const bool.

Ответ 4

Я думаю, что лучше передать встроенные типы by value, а не const reference, так как это происходит быстрее. В случае прохождения по ссылке вам нужно создать ссылку (т.е. Принять адрес), а затем разыменовать ее при использовании переменной. В большинстве случаев он будет оптимизирован компилятором в любом случае, хотя

Ответ 5

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

Часто у вас нет выбора, если у вас есть какой-то шаблонный интерфейс, который должен работать для сложных типов и основных типов, и вам не нужны чрезмерные служебные накладные расходы (простейший пример: std::vector). Но если у вас есть выбор, то предпочтительнее передавать основные значения по типу.

Ответ 6

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