[C] Funkcje -> makra
Ostatnio zmodyfikowano 2013-05-25 18:30
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. ;) |
|
Mrovqa |
» 2013-05-25 18:01:15 Gdy preprocesor spotka makro to po prostu podmieni kod w miejscu jego wystąpienia, tzn: #define sum(a,b) ((a)+(b)) sum( 3, 6 * 2 )
(( 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ć... |
|
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: #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: SQ( a++ );
( a++ ) *( a++ ); Makra są rozwijane w czasie kompilacji. Jeśli argumentów nie otoczysz nawiasami, możesz się zdziwić efektem: #define SQ(A) A * A
SQ( 2 + 3 );
2 + 3 * 2 + 3
|
|
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. ;/ |
|
pekfos |
» 2013-05-25 18:21:54 Potęgi dwójki możesz otrzymywać przesuwając bitowo w lewo 1. To najszybsze rozwiązanie: 1 << n |
|
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 |
|
« 1 » |