Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Встроенные функции

309
27 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
Есть такое ключевое слово "inline". Означает, что код функции будет вложен в код другой функции. Тем самым, скорость программы будет увеличена за счёт отсутствия команд вызова/выхода.
inline функции имеют ряд ограничений. В них нельзя использовать операторы циклов (for, while), обработку исключений (try, catch, throw).
Так же нельзя использовать в качестве результата некоторые типы данных. Вопрос, чем обусловлено ограничение по типам данных, и что именно может и не может возвращать вложенная функция?
395
27 сентября 2006 года
RelB
367 / / 09.11.2002
[QUOTE=el scorpio]Есть такое ключевое слово "inline". Означает, что код функции будет вложен в код другой функции. Тем самым, скорость программы будет увеличена за счёт отсутствия команд вызова/выхода.
inline функции имеют ряд ограничений. В них нельзя использовать операторы циклов (for, while), обработку исключений (try, catch, throw).
Так же нельзя использовать в качестве результата некоторые типы данных. Вопрос, чем обусловлено ограничение по типам данных, и что именно может и не может возвращать вложенная функция?[/QUOTE]Откуда такая информация?!?
309
27 сентября 2006 года
el scorpio
1.1K / / 19.09.2006
[QUOTE=RelB]Откуда такая информация?!?[/QUOTE]
Из хелпа, вестимо :D . Или другую имеете - поделитесь с народом русским :) :)
Только там не написано, почему те или иные типы :confused: нельзя использовать как результат inline-функций. (Вернее можно - только тогда они станут обычными)
1
27 сентября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE=el scorpio]Из хелпа, вестимо :D . Или другую имеете - поделитесь с народом русским :) :)
Только там не написано, почему те или иные типы :confused: нельзя использовать как результат inline-функций. (Вернее можно - только тогда они станут обычными)[/QUOTE]
Вобще-то классический пример из Страуструпа имеет вид:
 
Код:
inline void cpy(char* p, const char* q)
         {
           while (*p++ = *q++) ;
         }

В хелпе же написано
Цитата:

An inline function that returns a class with a destructor by value will not be expanded inline whenever there are variables or temporaries that need to be destructed within the return expression

.
т.е. вы не можете вернуть значение, если по выходе из функции оно должно быть разрушено

Цитата:

An inline function that takes at least one parameter that is of type ’class with a destructor’ will not be expanded inline. Note that this restriction does not apply to classes that are passed by reference


не можете передать класс по значению - зато по ссылке без проблем.
Не можете определить как встраиваемую функцию, которая объявлена со спецификатором исключения.
спецификатор подсказывает компилятору, что вместо обычного вызова функции, можно просто сгенерировать ее код и вставить его в место вызова. Т.е. вместо кода типа:

 
Код:
78489875 call 78489890;
...
mov ah,bx;
ret;

будет просто
 
Код:
78489875 mov ah,bx;

т.е. исчезают накладные расходы на вызов функции и возврат в точку вызова. Отсюда и идут ограничения - если нет возврата из функции - не будет разрушен объект класса, например, если его разрушение определяется областью видимости.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог