12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
1 | |
const float &15.11.2013, 15:08. Показов 10862. Ответов 92
Метки нет (Все метки)
Заметил что часто передают и возвращают const float & ( например в мат либах ), вместо простой передачи значения.
Возникает вопрос: В чём плюс использования const float & вместо обычного float?
0
|
15.11.2013, 15:08 | |
Ответы с готовыми решениями:
92
Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? Что это bool operator== (const CLASS&) const; ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? const& и const* в имени функции |
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
15.11.2013, 19:33 [ТС] | 41 |
0
|
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
|
|
15.11.2013, 19:36 | 42 |
Это может использоваться для единообразия передачи данных в методы. Своего рода coding style. const для того, чтобы не было реюза входного параметра внутри метода (за исключением некоторых ситуаций). А вот & - согласен, можно и не писать. Но, повторюсь, для единообразия иногда пишут
programina, да в любом случае нули получаются. или около того ну так ситуация с холодным процессором сохранится, разве нет? только теперь это будет бить по другому циклу
1
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
15.11.2013, 19:37 | 43 |
Я говорил о том, что компилятор может вообще выкинуть вычисления в данном коде. У меня например нули.
0
|
15.11.2013, 19:57 | 44 |
А с этим?
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; } Сделала в цикле на 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 | |||||
Поменял на
Кликните здесь для просмотра всего текста
иначе 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
|
gray_fox
|
15.11.2013, 20:26
#47
|
0
|
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 У меня amd a10-4600m (3200Гц) Идея. Сейчас проверю на intel core i7 26**
0
|
15.11.2013, 20:29 | 49 |
ещё раз, для чего???
const float& нужен, чтобы сказать, что метод не изменяет содержимое аргумента по ссылке, то есть можно передавать в качестве аргументов метода всякие константы. для передачи просто float (без ссылки), const практически не требуется, т.к. функция по-любому не изменит значения оригинальных переменных, которые были переданы в метод при вызове.
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
15.11.2013, 20:33 | 50 |
Без оптимизации смысла это точно не имеет. В общем случае разница будет в пределах погрешности. Так что смысла гонять этот тест нет)
Добавлено через 2 минуты Это для "самоконтроля", если хотите, этот const даже на сигнатуру не влияет.
0
|
15.11.2013, 20:45 | 51 |
Чего так все панически боятся копии переменной? Создание копии - это пересылка из регистра в регистр. Передача по ссылке - это операция сложения (%fp + константа). И то, и другое работает на всех адекватных процессорах 1 такт. И то, и другое соптимизирует и удалит мусор даже самый дебильный компилятор. В случае передачи по ссылке дебильный компилятор может не вычистить лишнее место в стеке, но на скорость это никак не влияет.
Вместо того, чтобы мерять время на тесте из трёх строк, проще скомпилить с оптимизациями до ассемблерного файла и посмотреть разницу. Для данной задачи мы имеем ровно тот случай, когда размер (количество операций) имеет значение Наверняка так оно и есть. Во всяком случае других разумных объяснений не видно Обоснуй. Пока выглядит так, что ты считаешь себя умнее других Твой кривой замер не говорит вообще ни о чём. И является стандартным примером, когда человек из неправильного замера делает далеко идущие выводы
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
15.11.2013, 20:51 [ТС] | 52 |
programina
Я Вам скинул asm код, к чему вы дальше страдаете бредом? Все ваши:
0
|
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
|
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
|
15.11.2013, 21:26 | 59 |
А здесь? Очень криво?
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
|
15.11.2013, 21:28 | 60 |
Не по теме: kvadro, mov и float - не совместимы. Добавлено через 1 минуту
0
|
15.11.2013, 21:28 | |
15.11.2013, 21:28 | |
Помогаю со студенческими работами здесь
60
Ошибка: redeclaration of `const float PI' #define PI or static const float PI Что значит const float PI = 3.14159F ? Error C2664: 'sprintf' : cannot convert parameter 2 from 'float' to 'const char *' (const string &) Const & function Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |