Autor Wątek: inline w C#  (Przeczytany 4463 razy)

Offline Xion

  • Moderator
    • xion.log

# Sierpień 31, 2007, 12:23:22
Niektóre kompilatory umożliwiają jednak wymuszenie rozwijania bez względu na potencjalną efektywność. W VS robi się to na przykład przez __forceinline.

Dokładnie!! Ostatnio miałem problem, bo sobie zrobiłem na szablonikach metaprogramowanie używając dodatkowo SIMDów i chciałem by rekurencyjnie wygenerowany przez kompilator kod miał postać serii pojedynczych instrukcji SSE. Mimo inline'a było mase calli i związanych z nimi pierdół - masakryczny bałagan jedynm słowem, jednak po dodaniu __forceinline kompilator wygenerował mi piękny kodzik :)
Szkoda tylko że jak słusznie zauważył RM, jest to słówko specyficzne dla VS. Podobnie jak #pragmy kontrolujące rozwijanie funkcji (np. #pragma inline_recursion).

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mINA87

  • Użytkownik

# Sierpień 31, 2007, 14:08:02
Niektóre kompilatory umożliwiają jednak wymuszenie rozwijania bez względu na potencjalną efektywność. W VS robi się to na przykład przez __forceinline.

Dokładnie!! Ostatnio miałem problem, bo sobie zrobiłem na szablonikach metaprogramowanie używając dodatkowo SIMDów i chciałem by rekurencyjnie wygenerowany przez kompilator kod miał postać serii pojedynczych instrukcji SSE. Mimo inline'a było mase calli i związanych z nimi pierdół - masakryczny bałagan jedynm słowem, jednak po dodaniu __forceinline kompilator wygenerował mi piękny kodzik :)
Szkoda tylko że jak słusznie zauważył RM, jest to słówko specyficzne dla VS. Podobnie jak #pragmy kontrolujące rozwijanie funkcji (np. #pragma inline_recursion).

Ano niestety tak, jednak czasem warto skupić się na jednym kompilatorze i wycisnąć z niego siódme poty niż pisać syf który będzie działał wszędzie :) W moim wypadku gra była warta świeczki i jestem naprawdę zadowolony z efektów:
http://nopaste.warsztat.gd/?id=837
po zastosowaniu __forceinline wygenerowało taki kod ASM:
http://nopaste.warsztat.gd/?id=838
W tym momencie nie interesuje mnie żadna przenośność. Może w przyszlości komitet standaryzacyjny pomyśli o nas i wprowadzi coś na wzór __forceinline bo zastosowane z głową może być potężnym narzędziem (właśnie np. przy metaprogramowaniu). 

bies

  • Gość
# Wrzesień 01, 2007, 10:04:07
AFAIK GCC ma __attribute__((always_inline)) :)

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Wrzesień 01, 2007, 12:33:14
Ale tego z kolei nie ma chyba VC++ ;) Nie ma jednego rozwiązania. Ja poczekam aż komitet standaryzacyjny się tym zajmie (choć znając C++ to przyjdzie na to poczekać z 10 lat).

bies

  • Gość
# Wrzesień 01, 2007, 12:47:50
Jasne, czekajcie na Komitet bo nie potraficie użyć preprocesora. :P
#if defined(__GNUC__)
#   define FORCE_INLINE __attribute__((always_inline))
#else
#   define FORCE_INLINE __forceinline
#endif

void FORCE_INLINE function() {}