Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
1

const float &

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

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

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

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

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

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

const& и const* в имени функции
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из...

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

92
SatanaXIII
Почетный модератор
Эксперт С++
5796 / 2791 / 385
Регистрация: 01.11.2011
Сообщений: 6,797
Завершенные тесты: 1
15.11.2013, 15:14 2
Цитата Сообщение от kvadro Посмотреть сообщение
Возникает вопрос: В чём плюс использования const float & вместо обычного float?
Встречный вопрос: зачем служит const и что такое &?
0
Evg
Эксперт CАвтор FAQ
19891 / 7522 / 574
Регистрация: 30.03.2009
Сообщений: 20,982
Записей в блоге: 30
15.11.2013, 16:23 3
Цитата Сообщение от kvadro Посмотреть сообщение
В чём плюс использования const float & вместо обычного float?
Конкретно для float'а это скорее минус, чем плюс. А так нужно конкретный пример смотреть
0
kvadro
12 / 10 / 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
15.11.2013, 16:32
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:43 5
kvadro, что тут непонятного?
C++
const float & r
в аргументах функции означает r - это не абы что, а обьект, адрес которого берется, чтобы получить из него некое значение. А const запрещает менять значение этого обьекта внутри функции.
0
Evg
Эксперт CАвтор FAQ
19891 / 7522 / 574
Регистрация: 30.03.2009
Сообщений: 20,982
Записей в блоге: 30
15.11.2013, 16:45 6
Да, про пример я примерно так и подумал. В качестве результирующего кода в случае inline-подстановки разницы быть не должно. Без inline-подстановки при наличии const float & код ухудшится. Мне тоже было бы интересно узнать, зачем так делается.
0
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 16:52  [ТС] 7
programina
Повторюсь ещё раз - я спрашиваю не что такое ссылка и константа, я спрашиваю зачем передавать простые типы по ссылке?
0
ForEveR
В астрале
Эксперт С++
8005 / 4762 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
15.11.2013, 16:53 8
kvadro, Незачем. Предельно бессмысленно. Копия float пренебрежительно мала, следовательно резона нет ровным счетом никакого. const может использоваться, чтобы случайно не изменить переменную внутри функции. Но const& здесь бессмысленен.
0
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:57 9
Цитата Сообщение от Evg Посмотреть сообщение
Мне тоже было бы интересно узнать, зачем так делается
Для скорости.

Добавлено через 25 секунд
Цитата Сообщение от kvadro Посмотреть сообщение
зачем передавать простые типы по ссылке?
для скорости
0
ForEveR
В астрале
Эксперт С++
8005 / 4762 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
15.11.2013, 16:59 10
programina, Чего? Для какой скорости? И насколько часто вы это делаете? Особенно учитывая, что в конструкторе приведенном в любом случае будет копия при присваивании к значениям.
0
programina
2053 / 608 / 41
Регистрация: 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
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:04  [ТС] 12
programina
Так мы кладём в стек значение, а потом его получаем, а в данном случае мы кладём адрес ( что по скорости одинаково что мы бы положили значение ), потом этот адрес получаем, а потом получаем значение по данной ссылки.

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

Добавлено через 2 минуты
По ссылке 7.69
Без ссылки 9.67
Как у Вас такие числа получились - я не знаю, у меня совсем другой результат.
0
programina
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:06 13
Цитата Сообщение от kvadro Посмотреть сообщение
так что тут наоборот потеря скорости
Учите матчасть.
0
Raali
647 / 350 / 75
Регистрация: 06.07.2013
Сообщений: 1,123
Завершенные тесты: 1
15.11.2013, 17:07 14
Цитата Сообщение от programina Посмотреть сообщение
По ссылке 7.69
Без ссылки 9.67
у меня тоже так показывает, отсюда вопрос почему так?
0
ForEveR
В астрале
Эксперт С++
8005 / 4762 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
15.11.2013, 17:07 15
programina, А теперь включаем оптимизацию. У меня на gcc даже без оптимизаций
5.18
3.95
clang
7.61
8.12
Но... включаем оптимизацию и 0 0 показывают оба компилятора.

Передача под-типа по const ссылке является экономией на спичках, которая ничего не даст в релиз-режиме.
1
kvadro
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:10  [ТС] 16
Учите матчасть.
Просветите меня где я не прав.

Добавлено через 34 секунды
включаем оптимизацию и 0 0 показывают оба компилятора.
__attribute__((noinline)) добавьте
0
ForEveR
В астрале
Эксперт С++
8005 / 4762 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:16 18
Цитата Сообщение от Raali Посмотреть сообщение
у меня тоже так показывает, отсюда вопрос почему так?
Потому что создается копия обьекта внутри функции и работа идет с этой копией, а при использовании ссылки работа идет с уже созданным обьектом, по переданному им адресу.

Для непонятливых, const - защита от дурака.
0
kvadro
12 / 10 / 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
2053 / 608 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:28 20
kvadro, вы лучше вместо своих подсчетов, запустите мой пример и посмотрите числа.
0
15.11.2013, 17:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 17:28

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

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

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


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

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

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