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

const float &

15.11.2013, 15:08. Показов 10862. Ответов 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
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 19:33  [ТС] 41
Author24 — интернет-сервис помощи студентам
Покажите сгенерированый asm код
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2013, 19:36 42
Цитата Сообщение от kvadro Посмотреть сообщение
Возникает вопрос: В чём плюс использования const float & вместо обычного float?
Это может использоваться для единообразия передачи данных в методы. Своего рода coding style. const для того, чтобы не было реюза входного параметра внутри метода (за исключением некоторых ситуаций). А вот & - согласен, можно и не писать. Но, повторюсь, для единообразия иногда пишут

programina, да в любом случае нули получаются. или около того
Цитата Сообщение от programina Посмотреть сообщение
И еще, у кого по значению получилось быстрее, просто переставьте вызов по ссылки вниз, а по значению вверх. Дело в том, что у вас процессор холодный и ему нужно время чтобы разогнаться.
ну так ситуация с холодным процессором сохранится, разве нет? только теперь это будет бить по другому циклу
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
15.11.2013, 19:37 43
Цитата Сообщение от programina Посмотреть сообщение
Какой тогда смысл вообще что-то высчитывать? Я говорю о том случае когда наоборот каждый раз должно быть подсчитано значение.
Я говорил о том, что компилятор может вообще выкинуть вычисления в данном коде. У меня например нули.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 19:57 44
Цитата Сообщение от gray_fox Посмотреть сообщение
У меня например нули.
А с этим?
C++
#include <iostream>
#include <ctime>
using namespace std;
 
float *X = new float[1000000000];
 
float OBbEM_1(int  i, float &d) { return d/i; }
float OBbEM_2(int  i, float  d) { return d/i; }
 
int main()
{
    clock_t t;
    float f = 0.0;
 
    t = clock();
    for(int i = 0; i < 1000000000; i+=1) { f = i/100000.0; X[i] = OBbEM_1(i, f); }
    t = clock() - t;
    cout << t/1000000.0 << endl;
 
    t = clock();
    for(int i = 0; i < 1000000000; i+=1) { f = i/100000.0; X[i] = OBbEM_2(i, f); }
    t = clock() - t;
    cout << t/1000000.0 << endl;
 
    delete [] X;
}
Добавлено через 6 минут
Цитата Сообщение от I.M. Посмотреть сообщение
ну так ситуация с холодным процессором сохранится, разве нет? только теперь это будет бить по другому циклу
Сделала в цикле на 10 повторов, в итоге при оптимизации -O3 результаты одинаковые.

Добавлено через 5 минут
А теперь без оптимизации совсем - в итоге по ссылке быстрее! Все это говорит о том, что оптимизация компилятора делает передачу по ссылке заочно.



Добавлено через 3 минуты
Вот, попробуйте без оптимизации и с оптимизацией:
C++
#include <iostream>
#include <ctime>
using namespace std;
 
float *X = new float[100000000];
 
float OBbEM_1(int  i, float &d) { return d/i; }
float OBbEM_2(int  i, float  d) { return d/i; }
 
int main()
{
    clock_t t;
    float f = 0.0;
 
    for(int g = 0; g < 10; g++)
    {
        t = clock();
        for(int i = 0; i < 100000000; i+=1) { f = i/100000.0; X[i] = OBbEM_1(i, f); }
        t = clock() - t;
        cout << "По ссылке:   " << t/1000000.0 << endl;
 
        t = clock();
        for(int i = 0; i < 100000000; i+=1) { f = i/100000.0; X[i] = OBbEM_2(i, f); }
        t = clock() - t;
        cout << "По значению: " << t/1000000.0 << endl;
    }
    
    delete [] X;
}
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
15.11.2013, 20:14 45
Цитата Сообщение от programina Посмотреть сообщение
А с этим?
Поменял на
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <ctime>
using namespace std;
 
int const size = 200000000;
float *X = new float[size];
 
float OBbEM_1(int  i, float &d) { return d/i; }
float OBbEM_2(int  i, float  d) { return d/i; }
 
int main()
{
    clock_t t;
    float f = 0.0;
 
    for (std::size_t i = 0; i != 10; ++i)
    {
       t = clock();
       for(int i = 0; i < size; i+=1) { f = i/100000.0; X[i] = OBbEM_1(i + 1, f); }
       t = clock() - t;
      cout << t/1000000.0 << endl;
 
       t = clock();
       for(int i = 0; i < size; i+=1) { f = i/100000.0; X[i] = OBbEM_2(i + 1, f); }
       t = clock() - t;
       cout << t/1000000.0 << endl;
 
       cout << endl;
    }
 
    delete [] X;
}

иначе bad_alloc и деление на 0.
-O3
0.001174
0.000985

0.000961
0.00093

0.000928
0.000949

0.000931
0.000929

0.000936
0.000933

0.000926
0.000946

0.000953
0.000941

0.00095
0.00095

0.000945
0.000959

0.000947
0.000952

-Og, хоть смысла это и не имеет)
0.005248
0.002912

0.003422
0.002881

0.00342
0.002926

0.003427
0.002895

0.003416
0.002919

0.003387
0.002904

0.003419
0.002883

0.003346
0.0029

0.003414
0.002901

0.003423
0.002843
0
2062 / 618 / 41
Регистрация: 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
2062 / 618 / 41
Регистрация: 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
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
15.11.2013, 20:29 49
Цитата Сообщение от I.M. Посмотреть сообщение
const для того, чтобы не было реюза входного параметра внутри метода
ещё раз, для чего???
const float& нужен, чтобы сказать, что метод не изменяет содержимое аргумента по ссылке, то есть можно передавать в качестве аргументов метода всякие константы.
для передачи просто float (без ссылки), const практически не требуется, т.к. функция по-любому не изменит значения оригинальных переменных, которые были переданы в метод при вызове.
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
15.11.2013, 20:33 50
Цитата Сообщение от programina Посмотреть сообщение
Тоже самое, без оптимизации
Без оптимизации смысла это точно не имеет. В общем случае разница будет в пределах погрешности. Так что смысла гонять этот тест нет)

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

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

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

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

Не по теме:

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

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

Твой кривой замер не говорит вообще ни о чём. И является стандартным примером, когда человек из неправильного замера делает далеко идущие выводы
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 20:51  [ТС] 52
programina
Я Вам скинул asm код, к чему вы дальше страдаете бредом? Все ваши:
float f = 0.0;
Даже не попадают в стековую память,а сразу записываются в регистр. Что Вы сравниваете? Работу movq и movl на разные процессорах? Или что?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.11.2013, 20:51 53
Не читая 5 страниц демагогий выскажу своё мнение. Вещественные типы данных возвращаются в стеке FP (насколько я знаю не зависимо от разных соглашений вызовов), поэтому ответ прост:
const - нельзя менять (проверяется в compile-time)
& (ссылка) - не создаёт копию переменной, при том, что для стека FP, создавать копию, для современного компилятора, глупо ..
0
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 20:55  [ТС] 54
castaway
Не, ну я видел где используют и const int&.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.11.2013, 20:56 55
kvadro, ии..? В чём мораль?
0
2062 / 618 / 41
Регистрация: 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
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 21:19  [ТС] 58
ты видел где используют, но ты в этом смысла не видел..
Я и сейчас не понимаю Как единый стандарт - так там в одних функциях используется, в других - нет.

Производительность? Судя по asm коду даже без оптимизаций значение лежит в регистре и из него берётся, разве что компилятор генерирует +1 mov, собственно по результату и видно что на 1000000000 итераций мы получаем хлебные крошки.
0
2062 / 618 / 41
Регистрация: 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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
15.11.2013, 21:28 60

Не по теме:

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

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

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

Не по теме:

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

0
15.11.2013, 21:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2013, 21: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 и у меня возник вопрос, как это будет работать с функциями и...


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

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