Rent allmänt när det gäller optimering är det något som ska göras på kod man vet är en flaskhals i programmet. Att spendera en timme på att optimera något som tar en promille av programmets hela exekveringstid är slöseri. Så börja med att ta reda på vad som är flaskhalsarna i ditt program och sen betar du av och optimerar dessa i tur och ordning. Ett bra sätt att leta flaskhalsar är med en profiler, exempelvis: http://www.compuware.com/products/devpartner/profiler/
Sedan är det förstås bra att aldrig skriva flaskhalsar :), och man lär sig med tiden vad som är bra och dåligt.
Generellt kan man säga att optimeringen som görs av kompilatorer är mycket bra i moderna kompilatorer. Riktigt bra länkare klarar även att optimera över flera objektfiler, vilket gör att man (i princip) aldrig vinner på att sitta och handjaga exempelvis assembler-kod (tvärtom förstör man då ofta möjligheten till optimering för kompilator/länkare). Den stora vinsta man kan göra själv är att välja smarta algoritmer och datastrukturer.
Men det var inget svar på frågan du ställde. Det är några olika saker du visar, vi tittar på de olika exemplen:
GetPlayer(iPlayer)
Här måste man veta vad GetPlayer(iPlayer) innebär. För en tung sökning som har sidoeffekter kan det löna sig att hämta bara göra ett anrop istället för två, annars inte.
Du använder i första fallet ButtonInfo direkt, medan du i andra fallet använder GetButtonInfo()-metoden. Jag förmoder att det är samma sak (?), dvs GetButtonInfo() är bara en accessmetod för ButtonInfo-structen. Det är mycket elegantare att anropa accessmetoden än att direkt komma åt medlemsvariabler i klassen. Rätt skriven är skillnaden obefintlig. Med rätt skriven menar jag ungefär såhär:
class Foo {
//...
public:
button_info ButtonInfo;
button_info& GetButtonInfo() {
return ButttonInfo;
}
//...
};
och detta måste ligga "inline" i klassen (i header-filen), eftersom det är enda tillfället då man garanteras att metoden inline:as (vilket man bara ska göra för väldigt korta metoder, typiskt 1-raders accessmetoder).
En annan sak att fundera på är hur ofta if-satsen blir sann. Om den blir sann "sällan", drar du ju bara nytta av optimeringen "sällan".
Jag tycker personligen inte om att ha structar där man pillar på enskilda variabler som du gör (frmctr), utan brukar lägga variablerna privata och använda accessmetoder. Det är ingen som helst prestandaskillnad på detta om alla access-metoder är inline och 1-raders.