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

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

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

const float & - C++

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

92
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 18:18  [ТС] #31
То что в варианте с ссылками будет в 2 раза больше команд это понятно, но вот что результат при этом будет близок ( а как видно из постов у некоторых людей ещё и быстрей ), говорит что скорей разница будет зависеть от самого процессора.
0
programina
15.11.2013, 18:23
  #32

Не по теме:

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

0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.11.2013, 18:24 #33
programina, Почитайте же кучу тем, которые я скидывал, если английский позволяет.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 18:26  [ТС] #34
да в любом случае по ссылке будет быстрее, просто вы считаете себя умнее компилятора. Вот и все.
Вы так и не смогли аргументировать свои слова, так что я не вижу смысла принимать их всерьез.

А насчёт "умнее компилятора", давайте спросим у самого компилятора что он думает по этому поводу:
Assembler
1
2
3
4
5
6
7
8
9
movq    -8(%rbp), %rax
movss    (%rax), %xmm0
addss    %xmm0, %xmm0
movq    -16(%rbp), %rax
movss    (%rax), %xmm1
mulss    %xmm1, %xmm0
movq    -16(%rbp), %rax
movss    (%rax), %xmm1
mulss    %xmm1, %xmm0
Assembler
1
2
3
4
movss    -4(%rbp), %xmm0
addss    %xmm0, %xmm0
mulss    -8(%rbp), %xmm0
mulss    -8(%rbp), %xmm0
Ну и понятно в данном случае size_t > float( я об этом говорил в первом пункте ):

Assembler
1
2
movq        %rdi, -8(%rbp)
movq        %rsi, -16(%rbp)
Assembler
1
2
movss    %xmm0, -4(%rbp)
movss    %xmm1, -8(%rbp)
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.11.2013, 18:28 #35
Цитата Сообщение от programina Посмотреть сообщение
kvadro, да в любом случае по ссылке будет быстрее, просто вы считаете себя умнее компилятора. Вот и все.
) это как раз вы считаете себя умнее компилятора, утверждая, что
Цитата Сообщение от programina Посмотреть сообщение
в любом случае по ссылке будет быстрее
0
Tulosba
15.11.2013, 18:32
  #36

Не по теме:

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

4
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 18:45 #37
kvadro, gray_fox, Tulosba, почему то я своему компилятору верю больше чем утверждению о том, что по значению быстрее.

Кстати кусок асемблера от kvadro, о чем он хотел сказать?
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 18:51  [ТС] #38
programina
Попрошу удалится с темы, от Вас один флуд на тему "с ссылками быстрее", мнение не аргументировано, фактов нет.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.11.2013, 18:55 #39
Цитата Сообщение от programina Посмотреть сообщение
почему то я своему компилятору верю больше чем утверждению о том, что по значению быстрее.
Я и не говорил, что по значению быстрее. Но то, что у вас по ссылке быстрее - так это ничего не доказывает, при других условиях может быть совсем по другому, с чего вы решили, что это универсальное правило? Я лично не вижу ни одной причины.
+ судя по коду, компилятор может легко выкинуть циклы, т.к. результат вычислений не используется.
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 19:27 #40
Цитата Сообщение от kvadro Посмотреть сообщение
programina
Попрошу удалится с темы, от Вас один флуд на тему "с ссылками быстрее", мнение не аргументировано, фактов нет.
kvadro,

Цитата Сообщение от gray_fox Посмотреть сообщение
судя по коду, компилятор может легко выкинуть циклы, т.к. результат вычислений не используется
Какой тогда смысл вообще что-то высчитывать? Я говорю о том случае когда наоборот каждый раз должно быть подсчитано значение.

Добавлено через 28 минут
И еще, у кого по значению получилось быстрее, просто переставьте вызов по ссылки вниз, а по значению вверх. Дело в том, что у вас процессор холодный и ему нужно время чтобы разогнаться.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
15.11.2013, 19:33  [ТС] #41
Покажите сгенерированый asm код
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.11.2013, 19:36 #42
Цитата Сообщение от kvadro Посмотреть сообщение
Возникает вопрос: В чём плюс использования const float & вместо обычного float?
Это может использоваться для единообразия передачи данных в методы. Своего рода coding style. const для того, чтобы не было реюза входного параметра внутри метода (за исключением некоторых ситуаций). А вот & - согласен, можно и не писать. Но, повторюсь, для единообразия иногда пишут

programina, да в любом случае нули получаются. или около того
Цитата Сообщение от programina Посмотреть сообщение
И еще, у кого по значению получилось быстрее, просто переставьте вызов по ссылки вниз, а по значению вверх. Дело в том, что у вас процессор холодный и ему нужно время чтобы разогнаться.
ну так ситуация с холодным процессором сохранится, разве нет? только теперь это будет бить по другому циклу
1
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
15.11.2013, 19:37 #43
Цитата Сообщение от programina Посмотреть сообщение
Какой тогда смысл вообще что-то высчитывать? Я говорю о том случае когда наоборот каждый раз должно быть подсчитано значение.
Я говорил о том, что компилятор может вообще выкинуть вычисления в данном коде. У меня например нули.
0
programina
1914 / 599 / 37
Регистрация: 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
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 20:14
Привет! Вот еще темы с ответами:

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


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

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

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