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

inline-объясните что такое - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
^Tecktonik_KiLLeR
 Аватар для ^Tecktonik_KiLLeR
1144 / 426 / 19
Регистрация: 23.06.2009
Сообщений: 6,141
Завершенные тесты: 1
28.02.2010, 11:18     inline-объясните что такое #1
1.Перегрузка ф-ии-следует ли все функции перегрузить?
2.inline-объясните что такое
3.каким образом,если вызвать функции милионы раз,программа будет занимать все больше и больше в памяти?
пока что такие вопросы...
книга С++ за 21 день

Добавлено через 28 минут
4.выдает ошибку
Unhandled exception at 0x00401010 in proba.exe: 0xC00000FD: Stack overflow.
при рекурсии.Функция которая принимает число и удваивает ее
C++
1
2
3
4
5
6
int fib(int n){
 
if(n==1)return 1;
else if(n==0)return 0;
else return(fib(n)+fib(n));
}
Добавлено через 22 секунды
жалуется на
Цитата Сообщение от МедведЪ Посмотреть сообщение
else return(fib(n)+fib(n));
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
28.02.2010, 12:17     inline-объясните что такое #2
МедведЪ, у тебя тупо переполнение стека, напиши так
C++
1
else return (fib(n) << 1);
Тогда стек переполнится не так быстро
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
28.02.2010, 13:38     inline-объясните что такое #3
Цитата Сообщение от МедведЪ Посмотреть сообщение
1.Перегрузка ф-ии-следует ли все функции перегрузить?
"Перегрузка функции" в С++ означает, что ты можешь завести несколько функций с одним и тем же именем. Они будут различаться типами аргументов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int F(int i);  // раз F
double F(double d);  // два F
void F(const char *c);  // три F
void F();   // четыре F
float F(int f);  // а вот так нельзя, у нас уже есть F, принимающая int. Разность возвращаемых типов не учитывается. Компилятор выдаст ошибку.
// Вызовы:
int main()
{
    int i = F(1); // первая
    double d = F(2.0);  // вторая
    F("some string");  // третья
    F();  // четвёртая
    float f = F(1);  // снова первая, но целочисленный результат автоматически преобразуется во float
}
"Перегрузить все функции" - какое-то нелепое и бессмысленное занятие. Перегрузить можно любую функцию, но делать это следует при наличии такой надобности.

Цитата Сообщение от МедведЪ Посмотреть сообщение
2.inline-объясните что такое
inline - это функция, которая не вызывается, а встраивается прямо в месте вызова. Позволяет экономить время при вызове простых и несложных функций. Хотя компилятор сам соображает, следует ли такую функцию и в самом деле встраивать, или лучше вынести, формально она считается "несуществующей", то есть, под неё как бы не отводится отдельное место (хотя в реальности она вполне может стать полноправной отдельной функцией, если так решит компилятор) и как таковая она не может вызываться из других единиц трансляции только по прототипу, необходимо иметь её полное определение. Компилятор не возражает против объявлений одной и той же inline-функции в нескольких единицах трансляции. Таким образом, место таких функций скорее в заголовках, чем в .cpp-файлах. Метод, объявленный прямо в теле класса, автоматически считается инлайновым.

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
inline double square(double v)
{
    return v*v;
}
 
int main()
{
    double s;
    for(int i=0; i<10000000; ++i)
        s = square(i);
}
Без inline вызов функции square тратил бы дополнительные такты на передачу параметров, вызов, чистку стека и возврат. В результате этот десятимиллионный цикл выполнялся бы дольше.
Некоторые современные компиляторы имеют возможность встраивать вызовы не-inline функций. В Visual Studio это называется Link time code generation и включается в общих настройках проекта (General), в Linker - Optimization - Link Time Code Generation и в C/C++ - Optimization (опции Whole Program Optimization = Enable link-time code generation и Inline function expansion = Any suitable).

Цитата Сообщение от МедведЪ Посмотреть сообщение
3.каким образом,если вызвать функции милионы раз,программа будет занимать все больше и больше в памяти?
При каждом вызове функции на стеке размещается адрес возврата и набор параметров и локальных переменных. Таким образом, цепочка из миллиона последовательных вызовов забьёт стек мегабайтами данных. Однако при возврате из функции занятая ей на стеке память высвобождается. Это значит, что тебе надо следить только за тем, чтобы в разумных рамках оставалась вложенность вызовов, а не их количество. Впрочем, по нынешним временам есть только два распространённых способа загадить весь стек: бесконечная рекурсия, то есть, непрекращающаяся цепочка вызовов (банальная ошибка в логике программы), или попытка создать слишком крупный массив в качестве локальной переменной.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
28.02.2010, 17:18     inline-объясните что такое #4
Так же добавлю: Если настройка проекта debug: inline не работает: 100%.
Если Release: то компилятор может реагировать(считать)что это inline функция или не inline.
Если кому надо, могу кинуть источник на эту инфу.
Yandex
Объявления
28.02.2010, 17:18     inline-объясните что такое
Ответ Создать тему
Опции темы

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