( horvatha | 2013. 03. 25., h – 15:09 )

Az előzőekben már többen leírták: egyszerű adattal (int, float, double) ilyenkor nem érdemes szöszölni, tehát menjen át érték szerint, mert egy 64 bites rendszeren egy pointer is 8 bájt, ami nem kisebb, mint az egyszerű adatok mérete. Viszont a kód is áttekinthetőbb és szerintem a fordítóprogram is jobban tud optimalizálni, ha nincs megzavarva a pointerezéssel.

Ha érték szerint adsz át paramétereket egy nem túl sok kódsorból álló függvénynek, akkor jó eséllyel az optimalizáló beinlineolja (micsoda szó!) a függvényt, így a végtermékben még a stacket se fogja babrálni a kód, hanem a függvénytörzs kódja beépül a hívó rutinba és semmi adatmozgatás nem történik. Ennél gyorsabb megoldást nem lelsz, és ráadásul ez lesz az áttekinthető kód is.

Egy hosszú struktúránál már más lehet a helyzet, azt érdemes lehet mutatóval átadni. Ámbár ha a függvényed nem túl hosszú és a fordítóprogi beinlineolja, akkor igaziból nem is történik másolás.

Tehát: hacsak nem egy brutál méretű struct-od van, mindenképp érték szerint add át, mert ez az áttekinthető és egyáltalán nem biztos, hogy nyersz a pointerezéssel.

(Nekem az a tapasztalatom, hogy a mai fordítóprogramok elég fejlettek, így sokszor amit kézzel optimákolok, az rosszabbul sül el, mintha a C legkézenfekvőbb eszközeit használnám és rábíznám az optimalizációt a "-O3", "-finline-functions", stb-re. 15-20 éve nem így volt, akkor még egy Turbo-C vagy Borland C 3.0 esetén a kézi ügyeskedés sokszor vezetett jobb eredményre, mintha a fordítóra bíztam volna a dolgot.)