hacsak nem egy brutál méretű struct-od van, mindenképp érték szerint add át
Ez nem egy jo tanacs. Ezt eleg konnyu belatni, ha a masolasra gondolsz, ami mind CPU ido, mind stack meret szempontjabol problemas. Ez csak meg rosszabb lehet C++ eseten, ahol egy user-defined copy constructor meg koltsegesebbe teheti a masolast, nem veletlen hat, hogy read-only adatok atadasara a konstans referenciak (ill. pointerek) a hasznalatosak.
Csak nagyon kis meretu (es ez raadasul architektura fuggo) osszetett adattipusoknal nyerhetsz valamit ertek szerinti atadassal, pl. valami ilyesminel:
struct kicsi_vagyok {
u8 kicsi_vagyok;
u8 ha_meg_novok;
u8 beled_rugok;
};
Es ezt akar komolyan is veheted, mert az evek mulasaval biztosan jon majd valaki, aki ezt tovabb akarja "dudolni" es maris az effektiv ertek szerinti atadasbol egy processzor ido es stack zabalo folosleges masolas lesz, foleg mert ha a fuggvenyed mar 1000 helyen ertek szerinti atadassal van hivva, senki nem akarja majd egy kis "bovites" miatt, az osszes hivast pointer atadassa valtoztatni, sot valoszinuleg nem is fognak ra gondolni, hogy kellene. Meg rosszabb, ha ez nem egy belso fuggvenyecske, hanem mondjuk egy API resze. Megeri?
Az inline temahoz annyit, hogy ott alapvetoen nem a parameter atadas az egyetlen, amin az ember sporolni akar, megcsak nem is a legfontosabb, hanem onmagaban a fuggvenyhivas ara (stack frame letrehozasa, regiszterek mentese/helyreallitasa stb.). Ebbol kifolyolag arra a kerdesre, hogy mi a jobb, a referencia vagy ertek szerinti atadas, nem az inline fuggvenyek hasznalata a valasz, azok hasznalata inkabb csak ertelmetlenne teszik a kerdest.
Ja, a -O3 melle nem kell hasznalnod a -finline-functions kapcsolot is, az mar benne van. Bar ez nem fontos.