kedy mi inline metody prispeju k vykonu?? a moze byt aj taka inline metoda co mi vrati urcitu privatnu premmenu vo svoje triede??
Fórum › C / C++
Inline Methody
Pouzivani inline funkcí se doporučuje jen u kratších funkcí - při delších by výsledná binárka pěkně nabobtnala. A s tím návratem privátní proměnné by to mělo být možné.
a ta mensia funkcia je cca. 5 - 15 riadkov?? alebo menej napr. ako tie co vracaju private premmenne.
A urychlia inline funkcie aspon kus beh programu??
EDIT: mozu byt operatory(+-*/,...) inline??
Spíš 1 - 5 řádků
ahha, cize mi to dost pomoze pri funkciach ktore len vratia privatnu premmenu, privatna je z toho dovodu ze napr.: pri SetXYZ( Color4 start, Color4 end ), sa vytvori dalsia premenna ktora bude obsahovat ich rozdiel ktory sa bude pridavat k hodnote aktualnej farby( castice )
Edit: alebo sa este vytvori bool UseColorAdd, co uz asi chapete naco by mal byt a kedy bude true/false xD
ptat se jestli ti to urychli program je trochu naivni -- muj osobni tip je, ze rozdil se cloveku vubec neprojevi -- protoze to zalezi na prilis mnoha faktorech. kazdopadne nejlepsi co muzes udelat je to vyzkouset v obou variantach a vybrat si tu rychlejsi.
jinak inlinovani obecne je hodne specificka optimalizace. Sice se usetri tech par instrukci pro rezii prace se zasobnikem a volani funkce, jenze tyhle instrukce jsou dnes docela optimalizovane. Dalsi plus muze byt, ze kompilator "vidi" do funkce jeste pred jejim volanim a muze tak provadet nejake dopredne optimalizace sam. Nevyhodou je zvetseni binarky (coz ale nemusi byt vzdy pravda! Pokud je inlinovana funkce mensi nez onech asi rezijnich 6 instrukci, tak se naopak binarka zmensi) a prodlouzeni kodu volajici funkce, coz muze mit nasledky snizeni jeji referencni lokality. Ale predevsim, nejvetsi problem dnesnich programu nejsou cekani na provedeni instrukci procesorem (cemuz by inlining pomahal), ale cekani na doruceni dat do procesoru, predevsim z ramky, takze casto je nejlepsi optimalizovat cache... ale zalezi na konkretnim pripade...
cachema musi projit vsechno, co jde k procesoru, veskera data (myslim ze existuje nejaka specialni instrukce pro loadovani mimo cache, ale nejsem si tim vubec jist...). kompilator do toho kecat nemuze (teda az na drobnosti jako ze nejakou promennou necha jako registrovou). a z plne cache se vetsinou vyhazuje vec ktera byla naposledy pouzita pred nejvetsi dobou (lru, last recently used). vetsinou ti ale nejde o samotne promenne, ale o velke datove useky, pole atd.
byt tebou, tak se zatim moc optimalizacema nezabyvam.. az se naucis assembler, muzes si to nechat zkompilovat do nej a pak porovnavat "optimalnost kodu"...
taky neni od veci se poradne naucit algoritmizaci, dynamicke datove struktury, ...
pokud neco delas amatersky (napriklad: for ( i=0 ; i < strlen(retezec)-1 ; i++ ) { ... } ) tak te nezachrani ani inline
funguje to tak, ze kdykoli k pristupujes k nejakym polozkam (coz znamena jedno slovo, tedy 32 nebo 64 bitu -- procesor nikdy nechce vic dat najednou, kdyz nepocitam vyjimky typu sse), tak procesor posle zpravu cachim ze chce konkretni udaj. Pokud ten v cache je, tak se posle procesoru, pokud ne, tak se z pameti nacte oblast velika jako jeden cachovy radek (u me to je 64 byte, zjistit to muzes nekde v /sys/devices/system/cpu/cpu0/cache/coherency_line_size nebo tak), ulozi se do cache a vybere se z ni udaj ktery potrebujes (ten udaj ale muze lezet na zlomu dvou cachovych radku, pokud to v pameti neni zarovnane). Z toho plyne, ze pokud prochazis pole intu, tak te to bude stat zhruba jeden pristup do hlavni pameti kazdys 16 nacteni, pokud ale prochazis spojak tak te to bude pravdepodobne stat pristup do pameti pokazde...
strlen som este ani raz zatial nepouzil, dlzku array-u si ukladam napr.: particles_lenghth, ale pocet castic si ukladam zvlast particles_count, array si zvetsim len ked ma malo miesta, ale zatial ho nezmensujem, ale ale aktivne castice si ukladam do ineho array-u, a ked castica "zomrie", tak to posuniem:KIIV napsalpokud neco delas amatersky (napriklad: for ( i=0 ; i < strlen(retezec)-1 ; i++ ) { ... } ) tak te nezachrani ani inline
Vector2F gravity = this->ParticleGravity * timedelta; // tu viem ze mam chybu lebo neviem ako sa pocita gravitacia s roznymi casami
for( int i = 0, y = 0; i < particles_length; i++ )
{
particles[particles_sort[i]].Life -= ...;
if( particles[particles_sort[i]].Life > 0 )
{
particles_sort[y] = particles_sort[i];
i++;
particles[particles_sort[y]].Position += particles[particles_sort[y]].Speed * timedelta;
particles[particles_sort[y]].Speed += gravity;
particles[particles_sort[y]].Color +=...
}
else
{
particles_alive[i] = false; // dolezite re vytvaranie novych castic
// ale rozmyslam ci vy nebolo lepsie vytvorit novy array: int * Particles_InAlive;
//lebo to by bolo:
this->Particles_InAlive[(Particles_InAlive_Count++)-1] = i;
}
}
Ale u mna je ten y CurrentLastParticle, a ked zistite nejake urychlenie tak mi mozete povedat. a este jedna vec mi napadla, mam to vsetko robit naraz( posunitie, zmena farby, alebo pre kazdu vec mam pouzit novy cyklus ) a este jedna vec moze jedna struktura obshovat cca. 10 float-ov, cize velkost je cca 40 bajtov.Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Co je to inline funkcia? — založil Tom@sQo
Inline assembler — založil Kolcek93
Inline ASM ve VS - Jumptable — založil MilanL
Inline dropdown menu — založil Hanulik
Moderátoři diskuze