inline-функции
От: Lone Беларусь  
Дата: 05.02.04 17:06
Оценка:
Как можно узнать, действительно ли компилятор использовал встраивание для inline-функций, а не обычный вызов при компиляции программы? Будет ли встроена функция большого размера, скажем, строк на 100?
Re: inline-функции
От: Othello  
Дата: 05.02.04 17:14
Оценка:
Здравствуйте, Lone, Вы писали:

L>Как можно узнать, действительно ли компилятор использовал встраивание для inline-функций, а не обычный вызов при компиляции программы? Будет ли встроена функция большого размера, скажем, строк на 100?


Будет.
Не встраиваются функции содержащие циклы (for, while, do).
Re[2]: inline-функции
От: SergeMukhin Россия  
Дата: 05.02.04 17:41
Оценка: +1
Здравствуйте, Othello, Вы писали:

O>Не встраиваются функции содержащие циклы (for, while, do).


это очень сильное утверждение, и не соответствует истине

ф-ия

inline int f() {
  int r = 0;
  for(int i=0; i<5; i++) r += i;
  return r;
}
int main() {
  return f();
}


генерится Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
в

PUBLIC    _main
; Function compile flags: /Ogty
_TEXT    SEGMENT
_main    PROC NEAR
; Line 8
    mov    eax, 10                    ; 0000000aH
; Line 11
    ret    0
_main    ENDP
... << RSDN@Home 1.1.0 stable >>
---
С уважением,
Сергей Мухин
Re[3]: inline-функции
От: Lone Беларусь  
Дата: 05.02.04 20:13
Оценка:
Вот, что нашел по своему вопросу в MSDN:

The insertion (called inline expansion or inlining) occurs only if the compiler's cost/benefit analysis show it to be profitable. Inline expansion alleviates the function-call overhead at the potential cost of larger code size.
...
The inline keyword tells the compiler that inline expansion is preferred. However, the compiler can create a separate instance of the function (instantiate) and create standard calling linkages instead of inserting the code inline. Two cases where this can happen are:
Recursive functions.
Functions that are referred to through a pointer elsewhere in the translation unit.
These reasons may interfere with inlining, as may others, at the discretion of the compiler; you should not depend on the inline specifier to cause a function to be inlined.

Из чего можно сделать вывод, что в общем случае нельзя однозначно сказать, будет ли фактически встроена та или иная функция — окончательное решение принимает компилятор на основании некоторого эвристического анализа. Но можно ли как-нибудь узнать уже после компиляции, для каких встроенных функций было выполнено inline-расширение, а для каких нет?
Я так понимаю, что это вопрос больше относится к конкретным реализациям компиляторов, а не собственно к языку С++. Например, для MS VC++:

If the compiler cannot inline a function declared with __forceinline, it generates a level 1 warning (4714).

А как насчет функций, объявленных с ключевым словом inline?
Re[4]: inline-функции
От: vadim77 Израиль  
Дата: 05.02.04 23:06
Оценка:
Здравствуйте, Lone, Вы писали:

L>А как насчет функций, объявленных с ключевым словом inline?


А почему бы просто под "дебаггером" не посмотреть ассемблерный код, интересуещей тебя функции?
Re[5]: inline-функции
От: Atilla Россия  
Дата: 05.02.04 23:11
Оценка:
Здравствуйте, vadim77, Вы писали:

L>>А как насчет функций, объявленных с ключевым словом inline?

V>А почему бы просто под "дебаггером" не посмотреть ассемблерный код, интересуещей тебя функции?

или ключиком /D inline=__forceinline
Кр-ть — с.т.
Re: inline-функции
От: zrs  
Дата: 06.02.04 07:54
Оценка:
Здравствуйте, Lone, Вы писали:

L>Как можно узнать, действительно ли компилятор использовал встраивание для inline-функций, а не обычный вызов при компиляции программы?

GCC с ключем -Winline показывает все функции, которые не удалось встроить,
кроме того есть другие полезные ключи типа -finline-limit=n и прочие.
В Intel/Visual можно включить генерацию асмового листинга и смотреть.

L>Будет ли встроена функция большого размера, скажем, строк на 100?

О, это зависит от положения звезд на небе
... << RSDN@Home 1.1.2 stable >>
Re[6]: inline-функции
От: maq Россия http://www.maqdev.com
Дата: 06.02.04 11:15
Оценка:
Здравствуйте, Atilla, Вы писали:

A>Здравствуйте, vadim77, Вы писали:


L>>>А как насчет функций, объявленных с ключевым словом inline?

V>>А почему бы просто под "дебаггером" не посмотреть ассемблерный код, интересуещей тебя функции?

A>или ключиком /D inline=__forceinline


Интересно, в этом случае будет форсироваться подстановка всех функций
определенных полностью в классе? (т.е. те которые неявно inline)
Re[4]: inline-функции
От: Lone Беларусь  
Дата: 06.02.04 20:49
Оценка:
L>А как насчет функций, объявленных с ключевым словом inline?
А для таких функций есть свое предупреждение:

Compiler Warning (level 4) C4710
'function' : function not inlined
The given function was selected for inline expansion, but the compiler did not perform the inlining.
...

Сам ответил Мог бы и не задавать, если бы сразу хорошенько поискал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.