Форум программистов, компьютерный форум 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
15.11.2013, 15:14     const float & #2
Цитата Сообщение от kvadro Посмотреть сообщение
Возникает вопрос: В чём плюс использования const float & вместо обычного float?
Встречный вопрос: зачем служит const и что такое &?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,135
Записей в блоге: 26
15.11.2013, 16:23     const float & #3
Цитата Сообщение от kvadro Посмотреть сообщение
В чём плюс использования const float & вместо обычного float?
Конкретно для float'а это скорее минус, чем плюс. А так нужно конкретный пример смотреть
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 16:32  [ТС]     const float & #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 и что такое &?
Я прекрасно понимаю что это и зачем, но в чём смысл передавать ссылку на простые типы?
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:43     const float & #5
kvadro, что тут непонятного?
C++
const float & r
в аргументах функции означает r - это не абы что, а обьект, адрес которого берется, чтобы получить из него некое значение. А const запрещает менять значение этого обьекта внутри функции.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,135
Записей в блоге: 26
15.11.2013, 16:45     const float & #6
Да, про пример я примерно так и подумал. В качестве результирующего кода в случае inline-подстановки разницы быть не должно. Без inline-подстановки при наличии const float & код ухудшится. Мне тоже было бы интересно узнать, зачем так делается.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 16:52  [ТС]     const float & #7
programina
Повторюсь ещё раз - я спрашиваю не что такое ссылка и константа, я спрашиваю зачем передавать простые типы по ссылке?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.11.2013, 16:53     const float & #8
kvadro, Незачем. Предельно бессмысленно. Копия float пренебрежительно мала, следовательно резона нет ровным счетом никакого. const может использоваться, чтобы случайно не изменить переменную внутри функции. Но const& здесь бессмысленен.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 16:57     const float & #9
Цитата Сообщение от Evg Посмотреть сообщение
Мне тоже было бы интересно узнать, зачем так делается
Для скорости.

Добавлено через 25 секунд
Цитата Сообщение от kvadro Посмотреть сообщение
зачем передавать простые типы по ссылке?
для скорости
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.11.2013, 16:59     const float & #10
programina, Чего? Для какой скорости? И насколько часто вы это делаете? Особенно учитывая, что в конструкторе приведенном в любом случае будет копия при присваивании к значениям.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:00     const float & #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

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

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

Добавлено через 2 минуты
По ссылке 7.69
Без ссылки 9.67
Как у Вас такие числа получились - я не знаю, у меня совсем другой результат.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:06     const float & #13
Цитата Сообщение от kvadro Посмотреть сообщение
так что тут наоборот потеря скорости
Учите матчасть.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
15.11.2013, 17:07     const float & #14
Цитата Сообщение от programina Посмотреть сообщение
По ссылке 7.69
Без ссылки 9.67
у меня тоже так показывает, отсюда вопрос почему так?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.11.2013, 17:07     const float & #15
programina, А теперь включаем оптимизацию. У меня на gcc даже без оптимизаций
5.18
3.95
clang
7.61
8.12
Но... включаем оптимизацию и 0 0 показывают оба компилятора.

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

Добавлено через 34 секунды
включаем оптимизацию и 0 0 показывают оба компилятора.
__attribute__((noinline)) добавьте
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.11.2013, 17:12     const float & #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.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 17:16     const float & #18
Цитата Сообщение от Raali Посмотреть сообщение
у меня тоже так показывает, отсюда вопрос почему так?
Потому что создается копия обьекта внутри функции и работа идет с этой копией, а при использовании ссылки работа идет с уже созданным обьектом, по переданному им адресу.

Для непонятливых, const - защита от дурака.
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 17:22  [ТС]     const float & #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 то уже на первом шаге мы проигрываем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 17:28     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, 17:28     const float & #20
kvadro, вы лучше вместо своих подсчетов, запустите мой пример и посмотрите числа.
Yandex
Объявления
15.11.2013, 17:28     const float &
Ответ Создать тему
Опции темы

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