""hacsak nem egy brutál méretű struct-od van, mindenképp érték szerint add át""
"Ez nem egy jo tanacs...."
Egy része tényleg kérdéses. Azzal Te is egyetértesz, hogy float-ot vagy int-et nem érdemes mutatóval átadni, ha nem akarjuk módosítani. Az egyetlen különbség a Te és az én véleményem közt a nem túl nagy méretű struct-ok esetén van. Ha ilyet érték szerint adunk át, gyorsabb kódunk lehet, ezt el is ismerted. Én pedig a kérdésnek megfelelően csak erre koncentráltam. Úgy értettem a kérdést, hogy a kérdezőnek extrém fontos a kimeneti kód sebessége, és ennek megfelelően válaszoltam.
A program fejlesztése szempontjából persze hogy a mutatós megoldás a jó struct esetén, és én magam is (bár hajlamos vagyok az agyonoptimalizálásra) mindig pointerrel adom át a structot, hacsak nem igen kifejezetten tudom, hogy ez később is kisméretű marad (pl. egy kétdimenziós float vektor esetén). Tehát lényegében ugyanazt mondjuk, csak a kérdés hangsúlyát értettük máshogy.
Azaz a korrigált tanulság: ha nem akarod megváltoztatni az értékét, akkor float, int, double, char stb. érték szerint adandó át. struct-nál a kód fejlesztése szempontjából mindenképp a mutatós átadás a célszerű. Ha extrém fontos a kimeneti kód sebessége és lehet tudni, hogy a struktúra nem fog bővülni, akkor a kisméretű struct-ok esetén az érték szerinti átadás a javasolt.
(Továbbá: Nyilvánvaló, hogy az inlineolás nemcsak a paraméterátadás miatt gyorsít, hanem amiket írsz és még ráadásul a beinlineolt kóddal könnyebben kezd valamit az optimalizáló, ha nem kell a pointerekkel szórakoznia, amikor pointerrel adod át a paramétert.)
(És ha már precízkedünk: nem ajánlottam együtt a "-O3"-at és a "-finline-functions"-t. Külön idézőjelben voltak.)