Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
#1

const float & - C++

15.11.2013, 15:08. Просмотров 4095. Ответов 92
Метки нет (Все метки)

Заметил что часто передают и возвращают const float & ( например в мат либах ), вместо простой передачи значения.

Возникает вопрос: В чём плюс использования const float & вместо обычного float?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2013, 15:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос const float & (C++):

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? - C++
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

Что это bool operator== (const CLASS&) const; - C++
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...

Ошибка: redeclaration of `const float PI' - C++
#include &lt;iostream&gt; using namespace std; int main () { int radiys; int total_okryznosti; int total_ploshadi; const...

#define PI or static const float PI - C++
Что лучьше обьясните? #define PI 3,14159265 или static const float PI=3,14159265;

92
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:10  [ТС] #16
Учите матчасть.
Просветите меня где я не прав.

Добавлено через 34 секунды
включаем оптимизацию и 0 0 показывают оба компилятора.
__attribute__((noinline)) добавьте
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2013, 17:12 #17
kvadro, Аналогично.
programina, Ну и можно почитать ответ на этот вопрос http://stackoverflow.com/questions/1...is-fundamental который покажет что товарищ kvadro рассуждает абсолютно логично.
In that case, passing a reference can involve an extra dereference when accessing the variable (at the very least the first time, possibly multiple times) At the same time, the compiler can perform more aggressive optimizations if the argument is by value, since it knows that the variable cannot be accessed/modified outside of the current function.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:16 #18
Цитата Сообщение от Raali Посмотреть сообщение
у меня тоже так показывает, отсюда вопрос почему так?
Потому что создается копия обьекта внутри функции и работа идет с этой копией, а при использовании ссылки работа идет с уже созданным обьектом, по переданному им адресу.

Для непонятливых, const - защита от дурака.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:22  [ТС] #19
Учите матчасть.
void test( float a ) {}
test( 1 );
1. Кладём 1 в стек
2. Вызываем функцию test
2. Вытягиваем 1

void test( const float &a ) {}
test( 1 );
1. Кладём адрес значения( по скорости аналогично что если бы мы просто положили значение )
2. Вызываем функцию
3. Вытягиваем адрес
4. Получаем значение по адресу

+1 операция


Потому что создается копия обьекта внутри функции и работа идет с этой копией, а при использовании ссылки работа идет с уже созданным обьектом, по переданному им адресу.
И что? Так мы создаём копию объекта( на стеке ), а так мы кладём ссылку в стек. Это эквивалетные операции. И по времени они аналогичны.

Добавлено через 3 минуты
А если мы работаем под x64 то уже на первом шаге мы проигрываем.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:28 #20
kvadro, вы лучше вместо своих подсчетов, запустите мой пример и посмотрите числа.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:29  [ТС] #21
И что? Так мы создаём копию объекта( на стеке ), а так мы кладём ссылку в стек. Это эквивалетные операции.
И по времени они аналогичны.
Перефразирую. Локальная переменная создаётся в любом случае, только в первом варианте она уже содержит значение, а во втором ссылку на это значение.
0
programina
15.11.2013, 17:31
  #22

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
включаем оптимизацию и 0 0 показывают оба компилятора
Ну можете добавить volatile

0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:32  [ТС] #23
вы лучше вместо своих подсчетов, запустите мой пример и посмотрите числа.
Без оптимизаций:
4.53236
4.50448
С оптимизациями:
2e-06
1e-06
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2013, 17:36 #24
programina, С volatile и noinline передача по ссылке чертовски проигрывает.

Еще можно почитать это: http://stackoverflow.com/questions/2...tant-reference
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
15.11.2013, 17:37 #25
Цитата Сообщение от Evg Посмотреть сообщение
Да, про пример я примерно так и подумал. В качестве результирующего кода в случае inline-подстановки разницы быть не должно. Без inline-подстановки при наличии const float & код ухудшится. Мне тоже было бы интересно узнать, зачем так делается.
Логично предположить, что это делается как раз в расчёте на инлайн, в виде своеобразной подстраховки, чтобы компилятору уж точно не пришло в голову создавать копии. Кроме того, подобные случаи могут быть проявлением cargo cult programming, слепого следования рекомендациям без малейшего понимания причин, лежащих в основе этих рекомендаций.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2013, 17:40 #26
И по-моему отличный ответ на вопрос: как стоит передавать переменные в С++.
http://stackoverflow.com/questions/2...functions-in-c
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:56 #27
Цитата Сообщение от ForEveR Посмотреть сообщение
С volatile и noinline передача по ссылке чертовски проигрывает.
Естественно, что по значению будет быстрее с оптимизацией, все равно ведь внешние обьекты не меняются.

Добавлено через 31 секунду
Это компилятор за вас решает, где и как оптимизировать
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.11.2013, 17:57 #28
Цитата Сообщение от Nick Alte Посмотреть сообщение
это делается как раз в расчёте на инлайн
о чем как раз говорит использование __forceinline во втором примере, а не стандартного inline.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.11.2013, 17:59 #29
Мне кажется это просто для единообразия; и я сильно сомневаюсь, что будет какая-либо разница в эффективности после оптимизации.
1
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
15.11.2013, 18:11 #30
Кто знает, может, в борландовских компиляторах разница-то будет...
0
15.11.2013, 18:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 18:11
Привет! Вот еще темы с ответами:

Что значит const float PI = 3.14159F ? - C++
Для изучения С++ использую книгу Лафоре. На стр. 61 видим предложение: &quot;Если вам необходимо описать константу long, то после ее числового...

Error C2664: 'sprintf' : cannot convert parameter 2 from 'float' to 'const char *' - C++
Читаю в Интернете пишут о том что нужно явное преобразование типов, подскажите, пжл, как его произвести. PS: если оно тут...

(const string &) - C++
Есть класс class Someclass { public: Someclass( const string &amp;one ) { cout &lt;&lt; one; } };

Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]" - C++
Вроде все правильно а все равно не работает. Подскажите в чем ошибка #include &lt;iostream&gt; template&lt;typename T&gt; inline const T...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru