Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> почему нельзя использовать inline??? прога не работает с inline 
:(
    Опции темы
KBADPAT
Дата 8.6.2007, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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"?
PM MAIL   Вверх
FiMa1
Дата 8.6.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Почему нельзя у меня код вполне работает (выводится 40000).
Код
#include <stdio.h>

typedef unsigned short UINT16;

inline int Max( int n, int m) { return n > m ? n : m; }

int main()
{
    UINT16 w1=40000, w2 = 0;

    printf( "%d\n", Max( w1, w2) );
    return 0;
}

С другой стороны, здесь есть определенная доля истины. Inline действительно не "работает" - см. дизассемблер:
Код
...
004113D4  call        Max (4110E6h) 
...
004110E6  jmp         Max (411420h) 
...
;inline int Max( int n, int m) { return n > m ? n : m; }
00411420  push        ebp  
00411421  mov         ebp,esp 
00411423  sub         esp,0C4h 
...
00411466  ret

Таким образом, вместо того, что бы вставить тело функции в место ее вызова, все таки происходит передача управления функции Max и, после ее завершения, возврат из нее.
Здесь не нужно забывать, что "спецификатор inline для компилятора является запросом, а не командой. Если, по разным причинам, компилятор не в состоянии выполнить запрос, функция будет компилироваться, как обычная функция, а запрос inline будет проигнорирован.
В зависимости от типа вашего компилятора возможны некоторые ограничения на использование встраиваемых функций. Например, некоторые компиляторы не воспринимают функцию как встраиваемую, если функция является рекурсивной или если она содержит либо статическую (static) переменную, либо любую инструкцию выполнения цикла, либо инструкцию switch, либо инструкцию goto. Вам необходимо просмотреть руководство по вашему компилятору, чтобы точно определить ограничения на использование встраиваемых функций."

Это сообщение отредактировал(а) FiMa1 - 8.6.2007, 08:58
PM   Вверх
korbian
Дата 8.6.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 336
Регистрация: 20.2.2007
Где: Penza

Репутация: 2
Всего: 14



Код рабочий, все нормально.
Принудительно сделать inline можно заменив inline на __forceinline(есть только в Visual Studio).  


--------------------
korbian ©
PM   Вверх
Homer
Дата 8.6.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 29.12.2004

Репутация: нет
Всего: нет



   Действительно, в дизассемблере посмотрел и при inline, и при __forceinline происходит вызов функции. Странно как то... 
     В таких случаях наверное лучше использовать макросы.
PM MAIL   Вверх
Daevaorn
Дата 8.6.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Homer @  8.6.2007,  10:27 Найти цитируемый пост)
Действительно, в дизассемблере посмотрел и при inline, и при __forceinline происходит вызов функции. Странно как то...      В таких случаях наверное лучше использовать макросы.

это из-за ...
PM MAIL WWW   Вверх
FiMa1
Дата 8.6.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM   Вверх
FiMa1
Дата 8.6.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Цитата(Homer @ 8.6.2007,  09:27)
Действительно, в дизассемблере посмотрел и при inline, и при __forceinline происходит вызов функции. Странно как то...

The /Ob compiler optimization option helps to determine whether inline function expansion actually occurs.
Controls inline expansion of functions.
/Ob{0|1|2}
  • 0 - Disables inline expansion, which is on by default.
  • 1 - Expands only functions marked as inline, __inline, __forceinline or __inline or, in a C++ member function, defined within a class declaration.
  • 2 - Expands functions marked as inline or __inline and any other function that the compiler chooses (expansion occurs at the compiler's discretion, often referred to as auto-inlining).
/Ob2 is in effect when /O1, /O2 (Minimize Size, Maximize Speed) or /Ox (Full Optimization) is used.
This option requires that you enable optimizations using /O1, /O2, /Ox, or /Og.
To set this compiler option in the Visual Studio development environment
  • Open the project's Property Pages dialog box. For details, see How to: Open Project Property Pages. 
  • Click the C/C++ folder.
  • Click the Optimization property page.
  • Modify the Inline Function Expansion property.
See also /O1, /O2, /Ox or /Og paths.


Это сообщение отредактировал(а) FiMa1 - 8.6.2007, 11:26
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.