Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
1

const float &

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

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

Возникает вопрос: В чём плюс использования const float & вместо обычного float?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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* в имени и параметрах функции(пример из...

92
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
15.11.2013, 15:14 2
Цитата Сообщение от kvadro Посмотреть сообщение
Возникает вопрос: В чём плюс использования const float & вместо обычного float?
Встречный вопрос: зачем служит const и что такое &?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.11.2013, 16:23 3
Цитата Сообщение от kvadro Посмотреть сообщение
В чём плюс использования const float & вместо обычного float?
Конкретно для float'а это скорее минус, чем плюс. А так нужно конкретный пример смотреть
0
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
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:43 5
kvadro, что тут непонятного?
C++
const float & r
в аргументах функции означает r - это не абы что, а обьект, адрес которого берется, чтобы получить из него некое значение. А const запрещает менять значение этого обьекта внутри функции.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
15.11.2013, 16:45 6
Да, про пример я примерно так и подумал. В качестве результирующего кода в случае inline-подстановки разницы быть не должно. Без inline-подстановки при наличии const float & код ухудшится. Мне тоже было бы интересно узнать, зачем так делается.
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 16:52  [ТС] 7
programina
Повторюсь ещё раз - я спрашиваю не что такое ссылка и константа, я спрашиваю зачем передавать простые типы по ссылке?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.11.2013, 16:53 8
kvadro, Незачем. Предельно бессмысленно. Копия float пренебрежительно мала, следовательно резона нет ровным счетом никакого. const может использоваться, чтобы случайно не изменить переменную внутри функции. Но const& здесь бессмысленен.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:57 9
Цитата Сообщение от Evg Посмотреть сообщение
Мне тоже было бы интересно узнать, зачем так делается
Для скорости.

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

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

Добавлено через 2 минуты
По ссылке 7.69
Без ссылки 9.67
Как у Вас такие числа получились - я не знаю, у меня совсем другой результат.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:06 13
Цитата Сообщение от kvadro Посмотреть сообщение
так что тут наоборот потеря скорости
Учите матчасть.
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
15.11.2013, 17:07 14
Цитата Сообщение от programina Посмотреть сообщение
По ссылке 7.69
Без ссылки 9.67
у меня тоже так показывает, отсюда вопрос почему так?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.11.2013, 17:07 15
programina, А теперь включаем оптимизацию. У меня на gcc даже без оптимизаций
5.18
3.95
clang
7.61
8.12
Но... включаем оптимизацию и 0 0 показывают оба компилятора.

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

Добавлено через 34 секунды
включаем оптимизацию и 0 0 показывают оба компилятора.
__attribute__((noinline)) добавьте
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.11.2013, 17:12 17
kvadro, Аналогично.
programina, Ну и можно почитать ответ на этот вопрос http://stackoverflow.com/quest... undamental который покажет что товарищ 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
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:16 18
Цитата Сообщение от Raali Посмотреть сообщение
у меня тоже так показывает, отсюда вопрос почему так?
Потому что создается копия обьекта внутри функции и работа идет с этой копией, а при использовании ссылки работа идет с уже созданным обьектом, по переданному им адресу.

Для непонятливых, const - защита от дурака.
0
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
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:28 20
kvadro, вы лучше вместо своих подсчетов, запустите мой пример и посмотрите числа.
0
15.11.2013, 17:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2013, 17:28
Помогаю со студенческими работами здесь

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

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

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

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

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

Const & function
Здравствуйте, читал статью про const и у меня возник вопрос, как это будет работать с функциями и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru