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

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

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

const float & - C++

15.11.2013, 15:08. Просмотров 3987. Ответов 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;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 20:24 #46
gray_fox, -O3 , кстати почему у вас числа такие маленькие, процессор мощный?
Bash
0.86
0.47
 
0.47
0.46
 
0.47
0.46
 
0.47
0.47
 
0.47
0.47
 
0.47
0.47
 
0.47
0.46
 
0.46
0.46
 
0.47
0.47
 
0.47
0.47
0
gray_fox
15.11.2013, 20:26
  #47

Не по теме:

Цитата Сообщение от programina Посмотреть сообщение
почему у вас числа такие маленькие, процессор мощный?
Intel Core i3, а вот RAM немного.

0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 20:29 #48
Тоже самое, без оптимизации
Bash
3.05
3.34
 
2.66
3.31
 
2.64
3.33
 
2.64
3.35
 
2.75
3.38
 
2.7
3.34
 
2.68
3.37
 
2.68
3.39
 
2.66
3.38
 
2.68
3.42
Добавлено через 2 минуты
Цитата Сообщение от gray_fox Посмотреть сообщение

Не по теме:


Intel Core i3, а вот RAM немного.

У меня amd a10-4600m (3200Гц)
Идея. Сейчас проверю на intel core i7 26**
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
15.11.2013, 20:29 #49
Цитата Сообщение от I.M. Посмотреть сообщение
const для того, чтобы не было реюза входного параметра внутри метода
ещё раз, для чего???
const float& нужен, чтобы сказать, что метод не изменяет содержимое аргумента по ссылке, то есть можно передавать в качестве аргументов метода всякие константы.
для передачи просто float (без ссылки), const практически не требуется, т.к. функция по-любому не изменит значения оригинальных переменных, которые были переданы в метод при вызове.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
15.11.2013, 20:33 #50
Цитата Сообщение от programina Посмотреть сообщение
Тоже самое, без оптимизации
Без оптимизации смысла это точно не имеет. В общем случае разница будет в пределах погрешности. Так что смысла гонять этот тест нет)

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
для передачи просто float (без ссылки), const практически не требуется, т.к. функция по-любому не изменит значения оригинальных переменных, которые были переданы в метод при вызове.
Это для "самоконтроля", если хотите, этот const даже на сигнатуру не влияет.
0
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
15.11.2013, 20:45 #51
Цитата Сообщение от Nick Alte Посмотреть сообщение
Логично предположить, что это делается как раз в расчёте на инлайн, в виде своеобразной подстраховки, чтобы компилятору уж точно не пришло в голову создавать копии. Кроме того, подобные случаи могут быть проявлением cargo cult programming, слепого следования рекомендациям без малейшего понимания причин, лежащих в основе этих рекомендаций.
Чего так все панически боятся копии переменной? Создание копии - это пересылка из регистра в регистр. Передача по ссылке - это операция сложения (%fp + константа). И то, и другое работает на всех адекватных процессорах 1 такт. И то, и другое соптимизирует и удалит мусор даже самый дебильный компилятор. В случае передачи по ссылке дебильный компилятор может не вычистить лишнее место в стеке, но на скорость это никак не влияет.

Вместо того, чтобы мерять время на тесте из трёх строк, проще скомпилить с оптимизациями до ассемблерного файла и посмотреть разницу. Для данной задачи мы имеем ровно тот случай, когда размер (количество операций) имеет значение

Цитата Сообщение от gray_fox Посмотреть сообщение
Мне кажется это просто для единообразия; и я сильно сомневаюсь, что будет какая-либо разница в эффективности после оптимизации.
Цитата Сообщение от I.M. Посмотреть сообщение
Это может использоваться для единообразия передачи данных в методы
Наверняка так оно и есть. Во всяком случае других разумных объяснений не видно

Цитата Сообщение от programina Посмотреть сообщение

Не по теме:

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

Обоснуй. Пока выглядит так, что ты считаешь себя умнее других

Твой кривой замер не говорит вообще ни о чём. И является стандартным примером, когда человек из неправильного замера делает далеко идущие выводы
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 20:51  [ТС] #52
programina
Я Вам скинул asm код, к чему вы дальше страдаете бредом? Все ваши:
float f = 0.0;
Даже не попадают в стековую память,а сразу записываются в регистр. Что Вы сравниваете? Работу movq и movl на разные процессорах? Или что?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.11.2013, 20:51 #53
Не читая 5 страниц демагогий выскажу своё мнение. Вещественные типы данных возвращаются в стеке FP (насколько я знаю не зависимо от разных соглашений вызовов), поэтому ответ прост:
const - нельзя менять (проверяется в compile-time)
& (ссылка) - не создаёт копию переменной, при том, что для стека FP, создавать копию, для современного компилятора, глупо ..
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 20:55  [ТС] #54
castaway
Не, ну я видел где используют и const int&.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.11.2013, 20:56 #55
kvadro, ии..? В чём мораль?
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 20:59 #56
В том случае
C++
const float &r
const скорее всего нужен только для того что подставлять число вместо переменной в функцию во время вызова
0
castaway
15.11.2013, 21:05
  #57

Не по теме:

kvadro, ты видел где используют, но ты в этом смысла не видел..

0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 21:19  [ТС] #58
ты видел где используют, но ты в этом смысла не видел..
Я и сейчас не понимаю Как единый стандарт - так там в одних функциях используется, в других - нет.

Производительность? Судя по asm коду даже без оптимизаций значение лежит в регистре и из него берётся, разве что компилятор генерирует +1 mov, собственно по результату и видно что на 1000000000 итераций мы получаем хлебные крошки.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 21:26 #59
Цитата Сообщение от Evg Посмотреть сообщение
Твой кривой замер не говорит вообще ни о чём.
А здесь? Очень криво?
C++
#include <iostream>
#include <ctime>
using namespace std;
 
float getRef(float &d) { return d; } // по ссылке
float getVal(float  d) { return d; } // по значению
 
int main()
{
    clock_t t;
    float f = 0.0;
    float X;
    float ref = 0.0, val = 0.0; // сумма
    long N = 1000000000;
    double sc = 1000000.0;
 
    cout << "ref\tval\n----------------" << endl;
 
    for(int g = 0; g < 10; g++)
    {
        t = clock(); // старт
        for(int i = 0; i < N; i++) X = getRef(f);
        t = clock() - t; // финиш
        ref += t;
        cout << t/sc << "\t";
 
        t = clock(); // старт
        for(int i = 0; i < N; i++) X = getVal(f);
        t = clock() - t; // финиш
        val += t;
        cout << t/sc << "\n";
    }
 
    cout << "----------------" << endl;
    cout << "ref: " << ref/sc << endl;
    cout << "val: " << val/sc << endl;
}
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
15.11.2013, 21:28 #60

Не по теме:

kvadro, mov и float - не совместимы.

Что тебя беспокоит?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от programina Посмотреть сообщение
А здесь? Очень криво?
Так не замеряют.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 21:28
Привет! Вот еще темы с ответами:

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


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

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

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