Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Funkcje -> makra

Ostatnio zmodyfikowano 2013-05-25 18:30
Autor Wiadomość
Xynxyn
Temat założony przez niniejszego użytkownika
[C] Funkcje -> makra
» 2013-05-25 17:43:21
Witam. Chciałbym się dowiedzieć czy przerabiając pewną trywialną funkcję na makro zwiększę wydajność aplikacji?
Mam funkcję pow (potęga), by zwiększyć wydajność aplikacji, chciałem aby wszystkimi obliczeniami z użyciem pow() zajął się preprocesor. Będzie to działać? (użyłem tam pętli for i funkcji return) Zwiększy wydajność? Nigdy nie robiłem makr co najwyżej stałe, dlatego właśnie pytam was, z czym to się je. ;)
P-83854
Mrovqa
» 2013-05-25 18:01:15
Gdy preprocesor spotka makro to po prostu podmieni kod w miejscu jego wystąpienia, tzn:
C/C++
#define sum(a,b) ((a)+(b))
sum( 3, 6 * 2 )
//preprocesor zamieni na:
(( 3 ) +( 6 * 2 ) )
Oszczędzić jedynie można skok do funkcji (ale tu spieszy nam z pomocą inline), a przy makrodefinicji takiej:
#define sth(a) ((a)+(a)+(a)+(a))
 i takim użyciu
sth( a * b / c )
 uzyskasz niezbyt wydajny kod. Wniosek: lepiej używaj funkcji. Takiego pow() ja sobie nie wyobrażam jakbyś chciał nawet zaimplementować...
P-83855
pekfos
» 2013-05-25 18:06:49
aby wszystkimi obliczeniami z użyciem pow() zajął się preprocesor.
W jakim sensie? Preprocesor co najwyżej wklei Ci kod funkcji (tu makrodefinicji) w miejsce "wywołania". Nie ma mowy o żadnych obliczeniach.

Prosty przykład: makro obliczające kwadrat:
C/C++
#define SQ(A) ((A) * (A))
Między nazwą makrodefinicji i nawiasem z argumentami nie może być odstępu. Każde użycie argumentu powinno być otoczone nawiasami, z tego prostego powodu, że nie wiadomo co to jest. Ponadto kod wpisany jako argument może zostać powielony, więc jeśli jako argument podasz wyrażenie modyfikujące wartość zmiennej, to ilość modyfikacji będzie zależna od implementacji makra:
C/C++
SQ( a++ );
//zmieni się w
( a++ ) *( a++ );
Makra są rozwijane w czasie kompilacji. Jeśli argumentów nie otoczysz nawiasami, możesz się zdziwić efektem:
C/C++
#define SQ(A) A * A

SQ( 2 + 3 );
//zmieni się w
2 + 3 * 2 + 3
//i zamiast 25, otrzymasz 11
P-83856
Xynxyn
Temat założony przez niniejszego użytkownika
» 2013-05-25 18:16:07
Dzięki, muszę robić wszystko, żeby optymalizować kod i szukam jak najróżniejszych rozwiązań zapisania niektórych funkcji jak najoptymalniej. Programuję na dość "egzotyczną" i starą platformę, dlatego takie starania o optymalizację. :)

Mam problem w jednej funkcji:
Gdzieniegdzie muszę dawać zamiast wbut - pow(2,wbut) (wbut, argument funkcji) i tu leży problem.
Jako argument podaję stałe, więc może zamiast pow pojawiałaby się inna stała? Jakoś nie umiem sobie tego wyobrazić jak to zrobić i czy to w ogóle możliwe. (nie const tylko #define, bo const to wystarczy zrobić tablicę ;|)
Jedyne co mi przychodzi na myśl to podawanie kolejnego argumentu, tylko, że... to jest bardzo niewygodne. ;/
P-83858
pekfos
» 2013-05-25 18:21:54
pow(2,wbut)
Potęgi dwójki możesz otrzymywać przesuwając bitowo w lewo 1. To najszybsze rozwiązanie:
1 << n
P-83860
Xynxyn
Temat założony przez niniejszego użytkownika
» 2013-05-25 18:30:04
Nawet o tym nie pomyślałem, a to logiczne, lepsze rozwiązanie. Dzięki. :P
P-83862
« 1 »
  Strona 1 z 1