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

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

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

const float & - C++

15.11.2013, 15:08. Просмотров 4035. Ответов 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
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
15.11.2013, 15:14 #2
Цитата Сообщение от kvadro Посмотреть сообщение
Возникает вопрос: В чём плюс использования const float & вместо обычного float?
Встречный вопрос: зачем служит const и что такое &?
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
15.11.2013, 16:23 #3
Цитата Сообщение от kvadro Посмотреть сообщение
В чём плюс использования const float & вместо обычного float?
Конкретно для float'а это скорее минус, чем плюс. А так нужно конкретный пример смотреть
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 16:32  [ТС] #4
Конкретно для float'а это скорее минус, чем плюс. А так нужно конкретный пример смотреть
Ну я понимаю что для простых типов это не нужно, вот и возник вопрос.

Простой пример:
C++
1
2
3
4
5
6
struct Color4
{
    Color4 ( const float &r, const float &g, const float &b, const float &a) : r( r ), g( g ), b( b ), a( a ) {}
 
    float r, g, b, a;
};
Ну или пример с гитхаба от дядь с Intel-а

C++
1
2
3
4
5
6
 /*! Uniform sphere sampling. */
  __forceinline Sample3f uniformSampleSphere(const float& u, const float& v) {
    const float phi = float(two_pi) * u;
    const float cosTheta = 1.0f - 2.0f * v, sinTheta = 2.0f * sqrt(v * (1.0f - v));
    return Sample3f(Vector3f(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta), float(one_over_four_pi));
  }

Встречный вопрос: зачем служит const и что такое &?
Я прекрасно понимаю что это и зачем, но в чём смысл передавать ссылку на простые типы?
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:43 #5
kvadro, что тут непонятного?
C++
const float & r
в аргументах функции означает r - это не абы что, а обьект, адрес которого берется, чтобы получить из него некое значение. А const запрещает менять значение этого обьекта внутри функции.
0
Evg
Эксперт CАвтор FAQ
17947 / 6178 / 413
Регистрация: 30.03.2009
Сообщений: 16,970
Записей в блоге: 27
15.11.2013, 16:45 #6
Да, про пример я примерно так и подумал. В качестве результирующего кода в случае inline-подстановки разницы быть не должно. Без inline-подстановки при наличии const float & код ухудшится. Мне тоже было бы интересно узнать, зачем так делается.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 16:52  [ТС] #7
programina
Повторюсь ещё раз - я спрашиваю не что такое ссылка и константа, я спрашиваю зачем передавать простые типы по ссылке?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2013, 16:53 #8
kvadro, Незачем. Предельно бессмысленно. Копия float пренебрежительно мала, следовательно резона нет ровным счетом никакого. const может использоваться, чтобы случайно не изменить переменную внутри функции. Но const& здесь бессмысленен.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:57 #9
Цитата Сообщение от Evg Посмотреть сообщение
Мне тоже было бы интересно узнать, зачем так делается
Для скорости.

Добавлено через 25 секунд
Цитата Сообщение от kvadro Посмотреть сообщение
зачем передавать простые типы по ссылке?
для скорости
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2013, 16:59 #10
programina, Чего? Для какой скорости? И насколько часто вы это делаете? Особенно учитывая, что в конструкторе приведенном в любом случае будет копия при присваивании к значениям.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:00 #11
C++
#include <iostream>
#include <ctime>
using namespace std;
 
 
float OBbEM_1(float &pi, float &R)
{
    return 2*pi*R*R;
}
 
float OBbEM_2(float pi, float R)
{
    return 2*pi*R*R;
}
 
int main()
{
    clock_t t;
    float pi = 3.14159;
    float R  = 10.0;
 
    float O;
 
    t = clock();
    for(int i = 0; i < 1000000000; i++) O = OBbEM_1(pi, R);
    t = clock() - t;
    cout << t/1000000.0 << endl;
 
    t = clock();
    for(int i = 0; i < 1000000000; i++) O = OBbEM_2(pi, R); 
    t = clock() - t;
    cout << t/1000000.0 << endl;
}
По ссылке 7.69
Без ссылки 9.67

Разница огромная!
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:04  [ТС] #12
programina
Так мы кладём в стек значение, а потом его получаем, а в данном случае мы кладём адрес ( что по скорости одинаково что мы бы положили значение ), потом этот адрес получаем, а потом получаем значение по данной ссылки.

+1 операция, так что тут наоборот потеря скорости.

Добавлено через 2 минуты
По ссылке 7.69
Без ссылки 9.67
Как у Вас такие числа получились - я не знаю, у меня совсем другой результат.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:06 #13
Цитата Сообщение от kvadro Посмотреть сообщение
так что тут наоборот потеря скорости
Учите матчасть.
0
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,062
Завершенные тесты: 1
15.11.2013, 17:07 #14
Цитата Сообщение от programina Посмотреть сообщение
По ссылке 7.69
Без ссылки 9.67
у меня тоже так показывает, отсюда вопрос почему так?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2013, 17:07 #15
programina, А теперь включаем оптимизацию. У меня на gcc даже без оптимизаций
5.18
3.95
clang
7.61
8.12
Но... включаем оптимизацию и 0 0 показывают оба компилятора.

Передача под-типа по const ссылке является экономией на спичках, которая ничего не даст в релиз-режиме.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 17:07
Привет! Вот еще темы с ответами:

Что значит 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...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
15.11.2013, 17:07
Ответ Создать тему
Опции темы

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