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

const float & - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.75
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 15:08     const float & #1
Заметил что часто передают и возвращают const float & ( например в мат либах ), вместо простой передачи значения.

Возникает вопрос: В чём плюс использования const float & вместо обычного float?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:29  [ТС]     const float & #21
И что? Так мы создаём копию объекта( на стеке ), а так мы кладём ссылку в стек. Это эквивалетные операции.
И по времени они аналогичны.
Перефразирую. Локальная переменная создаётся в любом случае, только в первом варианте она уже содержит значение, а во втором ссылку на это значение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
15.11.2013, 17:31
  #22

Не по теме:

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

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

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

Добавлено через 31 секунду
Это компилятор за вас решает, где и как оптимизировать
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.11.2013, 17:57     const float & #28
Цитата Сообщение от Nick Alte Посмотреть сообщение
это делается как раз в расчёте на инлайн
о чем как раз говорит использование __forceinline во втором примере, а не стандартного inline.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2013, 17:59     const float & #29
Мне кажется это просто для единообразия; и я сильно сомневаюсь, что будет какая-либо разница в эффективности после оптимизации.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
15.11.2013, 18:11     const float & #30
Кто знает, может, в борландовских компиляторах разница-то будет...
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 18:18  [ТС]     const float & #31
То что в варианте с ссылками будет в 2 раза больше команд это понятно, но вот что результат при этом будет близок ( а как видно из постов у некоторых людей ещё и быстрей ), говорит что скорей разница будет зависеть от самого процессора.
programina
15.11.2013, 18:23
  #32

Не по теме:

kvadro, да в любом случае по ссылке будет быстрее, просто вы считаете себя умнее компилятора. Вот и все.

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.11.2013, 18:24     const float & #33
programina, Почитайте же кучу тем, которые я скидывал, если английский позволяет.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 18:26  [ТС]     const float & #34
да в любом случае по ссылке будет быстрее, просто вы считаете себя умнее компилятора. Вот и все.
Вы так и не смогли аргументировать свои слова, так что я не вижу смысла принимать их всерьез.

А насчёт "умнее компилятора", давайте спросим у самого компилятора что он думает по этому поводу:
Assembler
1
2
3
4
5
6
7
8
9
movq    -8(%rbp), %rax
movss    (%rax), %xmm0
addss    %xmm0, %xmm0
movq    -16(%rbp), %rax
movss    (%rax), %xmm1
mulss    %xmm1, %xmm0
movq    -16(%rbp), %rax
movss    (%rax), %xmm1
mulss    %xmm1, %xmm0
Assembler
1
2
3
4
movss    -4(%rbp), %xmm0
addss    %xmm0, %xmm0
mulss    -8(%rbp), %xmm0
mulss    -8(%rbp), %xmm0
Ну и понятно в данном случае size_t > float( я об этом говорил в первом пункте ):

Assembler
1
2
movq        %rdi, -8(%rbp)
movq        %rsi, -16(%rbp)
Assembler
1
2
movss    %xmm0, -4(%rbp)
movss    %xmm1, -8(%rbp)
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2013, 18:28     const float & #35
Цитата Сообщение от programina Посмотреть сообщение
kvadro, да в любом случае по ссылке будет быстрее, просто вы считаете себя умнее компилятора. Вот и все.
) это как раз вы считаете себя умнее компилятора, утверждая, что
Цитата Сообщение от programina Посмотреть сообщение
в любом случае по ссылке будет быстрее
Tulosba
15.11.2013, 18:32
  #36

Не по теме:

в любом случае по ссылке будет быстрее
И.В.Сталин

programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 18:45     const float & #37
kvadro, gray_fox, Tulosba, почему то я своему компилятору верю больше чем утверждению о том, что по значению быстрее.

Кстати кусок асемблера от kvadro, о чем он хотел сказать?
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 18:51  [ТС]     const float & #38
programina
Попрошу удалится с темы, от Вас один флуд на тему "с ссылками быстрее", мнение не аргументировано, фактов нет.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2013, 18:55     const float & #39
Цитата Сообщение от programina Посмотреть сообщение
почему то я своему компилятору верю больше чем утверждению о том, что по значению быстрее.
Я и не говорил, что по значению быстрее. Но то, что у вас по ссылке быстрее - так это ничего не доказывает, при других условиях может быть совсем по другому, с чего вы решили, что это универсальное правило? Я лично не вижу ни одной причины.
+ судя по коду, компилятор может легко выкинуть циклы, т.к. результат вычислений не используется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 19:27     const float &
Еще ссылки по теме:

C++ const& и const* в имени функции
(const string &) C++
#define PI or static const float PI C++

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

Или воспользуйтесь поиском по форуму:
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 19:27     const float & #40
Цитата Сообщение от kvadro Посмотреть сообщение
programina
Попрошу удалится с темы, от Вас один флуд на тему "с ссылками быстрее", мнение не аргументировано, фактов нет.
kvadro,

Цитата Сообщение от gray_fox Посмотреть сообщение
судя по коду, компилятор может легко выкинуть циклы, т.к. результат вычислений не используется
Какой тогда смысл вообще что-то высчитывать? Я говорю о том случае когда наоборот каждый раз должно быть подсчитано значение.

Добавлено через 28 минут
И еще, у кого по значению получилось быстрее, просто переставьте вызов по ссылки вниз, а по значению вверх. Дело в том, что у вас процессор холодный и ему нужно время чтобы разогнаться.
Yandex
Объявления
15.11.2013, 19:27     const float &
Ответ Создать тему
Опции темы

Текущее время: 05:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru