12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
1 | |
const float &15.11.2013, 15:08. Показов 10856. Ответов 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* в имени функции |
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
15.11.2013, 15:14 | 2 |
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|||||||||||
15.11.2013, 16:32 [ТС] | 4 | ||||||||||
Простой пример:
0
|
15.11.2013, 16:43 | 5 |
kvadro, что тут непонятного?
C++ const float & r
0
|
15.11.2013, 16:45 | 6 |
Да, про пример я примерно так и подумал. В качестве результирующего кода в случае inline-подстановки разницы быть не должно. Без inline-подстановки при наличии const float & код ухудшится. Мне тоже было бы интересно узнать, зачем так делается.
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
15.11.2013, 16:52 [ТС] | 7 |
programina
Повторюсь ещё раз - я спрашиваю не что такое ссылка и константа, я спрашиваю зачем передавать простые типы по ссылке?
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2013, 16:53 | 8 |
kvadro, Незачем. Предельно бессмысленно. Копия float пренебрежительно мала, следовательно резона нет ровным счетом никакого. const может использоваться, чтобы случайно не изменить переменную внутри функции. Но const& здесь бессмысленен.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2013, 16:59 | 10 |
programina, Чего? Для какой скорости? И насколько часто вы это делаете? Особенно учитывая, что в конструкторе приведенном в любом случае будет копия при присваивании к значениям.
0
|
15.11.2013, 17:00 | 11 |
C++ #include <iostream> #include <ctime> using namespace std; float OBbEM_1(float &pi, float &R) { return 2*pi*R*R; } float OBbEM_2(float pi, float R) { return 2*pi*R*R; } int main() { clock_t t; float pi = 3.14159; float R = 10.0; float O; t = clock(); for(int i = 0; i < 1000000000; i++) O = OBbEM_1(pi, R); t = clock() - t; cout << t/1000000.0 << endl; t = clock(); for(int i = 0; i < 1000000000; i++) O = OBbEM_2(pi, R); t = clock() - t; cout << t/1000000.0 << endl; } Без ссылки 9.67 Разница огромная!
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
15.11.2013, 17:04 [ТС] | 12 |
programina
Так мы кладём в стек значение, а потом его получаем, а в данном случае мы кладём адрес ( что по скорости одинаково что мы бы положили значение ), потом этот адрес получаем, а потом получаем значение по данной ссылки. +1 операция, так что тут наоборот потеря скорости. Добавлено через 2 минуты
0
|
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
|
|
15.11.2013, 17:07 | 14 |
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2013, 17:07 | 15 |
programina, А теперь включаем оптимизацию. У меня на gcc даже без оптимизаций
Передача под-типа по const ссылке является экономией на спичках, которая ничего не даст в релиз-режиме.
1
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
15.11.2013, 17:10 [ТС] | 16 |
Добавлено через 34 секунды
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
15.11.2013, 17:12 | 17 |
kvadro, Аналогично.
programina, Ну и можно почитать ответ на этот вопрос http://stackoverflow.com/quest... undamental который покажет что товарищ kvadro рассуждает абсолютно логично.
0
|
15.11.2013, 17:16 | 18 |
Потому что создается копия обьекта внутри функции и работа идет с этой копией, а при использовании ссылки работа идет с уже созданным обьектом, по переданному им адресу.
Для непонятливых, const - защита от дурака.
0
|
12 / 10 / 1
Регистрация: 12.03.2012
Сообщений: 127
|
|
15.11.2013, 17:22 [ТС] | 19 |
2. Вызываем функцию test 2. Вытягиваем 1 2. Вызываем функцию 3. Вытягиваем адрес 4. Получаем значение по адресу +1 операция Добавлено через 3 минуты А если мы работаем под x64 то уже на первом шаге мы проигрываем.
0
|
15.11.2013, 17:28 | 20 |
kvadro, вы лучше вместо своих подсчетов, запустите мой пример и посмотрите числа.
0
|
15.11.2013, 17:28 | |
15.11.2013, 17:28 | |
Помогаю со студенческими работами здесь
20
Ошибка: 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |