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

programina, да в любом случае нули получаются. или около того
Цитата Сообщение от programina Посмотреть сообщение
И еще, у кого по значению получилось быстрее, просто переставьте вызов по ссылки вниз, а по значению вверх. Дело в том, что у вас процессор холодный и ему нужно время чтобы разогнаться.
ну так ситуация с холодным процессором сохранится, разве нет? только теперь это будет бить по другому циклу
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2013, 19:37     const float & #43
Цитата Сообщение от programina Посмотреть сообщение
Какой тогда смысл вообще что-то высчитывать? Я говорю о том случае когда наоборот каждый раз должно быть подсчитано значение.
Я говорил о том, что компилятор может вообще выкинуть вычисления в данном коде. У меня например нули.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 19:57     const float & #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;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2013, 20:14     const float & #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
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 20:24     const float & #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
gray_fox
15.11.2013, 20:26
  #47

Не по теме:

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

programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 20:29     const float & #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**
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.11.2013, 20:29     const float & #49
Цитата Сообщение от I.M. Посмотреть сообщение
const для того, чтобы не было реюза входного параметра внутри метода
ещё раз, для чего???
const float& нужен, чтобы сказать, что метод не изменяет содержимое аргумента по ссылке, то есть можно передавать в качестве аргументов метода всякие константы.
для передачи просто float (без ссылки), const практически не требуется, т.к. функция по-любому не изменит значения оригинальных переменных, которые были переданы в метод при вызове.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.11.2013, 20:33     const float & #50
Цитата Сообщение от programina Посмотреть сообщение
Тоже самое, без оптимизации
Без оптимизации смысла это точно не имеет. В общем случае разница будет в пределах погрешности. Так что смысла гонять этот тест нет)

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

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

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

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

Не по теме:

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

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

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

Не по теме:

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

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

Производительность? Судя по asm коду даже без оптимизаций значение лежит в регистре и из него берётся, разве что компилятор генерирует +1 mov, собственно по результату и видно что на 1000000000 итераций мы получаем хлебные крошки.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 21:26     const float & #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 21:28     const float &
Еще ссылки по теме:

C++ const& и const* в имени функции
(const string &) C++
#define PI or static const float PI C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
15.11.2013, 21:28     const float & #60

Не по теме:

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

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

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

Не по теме:

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

Yandex
Объявления
15.11.2013, 21:28     const float &
Ответ Создать тему
Опции темы

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