inline void cpy(char* p, const char* q)
{
while (*p++ = *q++) ;
}
Встроенные функции
inline функции имеют ряд ограничений. В них нельзя использовать операторы циклов (for, while), обработку исключений (try, catch, throw).
Так же нельзя использовать в качестве результата некоторые типы данных. Вопрос, чем обусловлено ограничение по типам данных, и что именно может и не может возвращать вложенная функция?
inline функции имеют ряд ограничений. В них нельзя использовать операторы циклов (for, while), обработку исключений (try, catch, throw).
Так же нельзя использовать в качестве результата некоторые типы данных. Вопрос, чем обусловлено ограничение по типам данных, и что именно может и не может возвращать вложенная функция?[/QUOTE]Откуда такая информация?!?
Из хелпа, вестимо :D . Или другую имеете - поделитесь с народом русским :) :)
Только там не написано, почему те или иные типы :confused: нельзя использовать как результат inline-функций. (Вернее можно - только тогда они станут обычными)
Только там не написано, почему те или иные типы :confused: нельзя использовать как результат inline-функций. (Вернее можно - только тогда они станут обычными)[/QUOTE]
Вобще-то классический пример из Страуструпа имеет вид:
Код:
В хелпе же написано
Цитата:
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;
...
mov ah,bx;
ret;
будет просто
Код:
78489875 mov ah,bx;
т.е. исчезают накладные расходы на вызов функции и возврат в точку вызова. Отсюда и идут ограничения - если нет возврата из функции - не будет разрушен объект класса, например, если его разрушение определяется областью видимости.