![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| KBADPAT |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 5.6.2007 Репутация: нет Всего: нет |
#include <stdio.h>
typedef unsigned short Word; inline int Max( int n, int m) { return n>m ? n : m; } Word w1=40000,w2 = 0; int main() { printf( “%d\n”, Max( w1, w2) ); return 0; } почему выводится "0"? |
|||
|
||||
| FiMa1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
Почему нельзя у меня код вполне работает (выводится 40000).
С другой стороны, здесь есть определенная доля истины. Inline действительно не "работает" - см. дизассемблер:
Таким образом, вместо того, что бы вставить тело функции в место ее вызова, все таки происходит передача управления функции Max и, после ее завершения, возврат из нее. Здесь не нужно забывать, что "спецификатор inline для компилятора является запросом, а не командой. Если, по разным причинам, компилятор не в состоянии выполнить запрос, функция будет компилироваться, как обычная функция, а запрос inline будет проигнорирован. В зависимости от типа вашего компилятора возможны некоторые ограничения на использование встраиваемых функций. Например, некоторые компиляторы не воспринимают функцию как встраиваемую, если функция является рекурсивной или если она содержит либо статическую (static) переменную, либо любую инструкцию выполнения цикла, либо инструкцию switch, либо инструкцию goto. Вам необходимо просмотреть руководство по вашему компилятору, чтобы точно определить ограничения на использование встраиваемых функций." Это сообщение отредактировал(а) FiMa1 - 8.6.2007, 08:58 |
||||
|
|||||
| korbian |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 336 Регистрация: 20.2.2007 Где: Penza Репутация: 2 Всего: 14 |
Код рабочий, все нормально.
Принудительно сделать inline можно заменив inline на __forceinline(есть только в Visual Studio). -------------------- korbian © |
|||
|
||||
| Homer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 29.12.2004 Репутация: нет Всего: нет |
Действительно, в дизассемблере посмотрел и при inline, и при __forceinline происходит вызов функции. Странно как то...
В таких случаях наверное лучше использовать макросы. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| FiMa1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
Да, KBADPAT, вот еще что, судя по исходнику (printf, stdio.h), вы пишете на языке Си, но "The inline keyword is available only in C++".
The __inline (Microsoft Specific) and __forceinline (Microsoft Specific) keywords are available in both C and C++. For compatibility with previous versions, _inline is a synonym for __inline. Это сообщение отредактировал(а) FiMa1 - 8.6.2007, 10:10 |
|||
|
||||
| FiMa1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: 5 Всего: 6 |
The /Ob compiler optimization option helps to determine whether inline function expansion actually occurs. Controls inline expansion of functions. /Ob{0|1|2}
This option requires that you enable optimizations using /O1, /O2, /Ox, or /Og. To set this compiler option in the Visual Studio development environment
Это сообщение отредактировал(а) FiMa1 - 8.6.2007, 11:26 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |