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.)