Insbesondere solche einfachen Sachen machen die Compiler schon lange richtig.
Auch lohnt es sich typischerweise nicht, aus Optimierungsgründen konstrukte wie
Code: Alles auswählen
if (x == 1)
foo();
else if (x == 2)
bar();
else
baz();
in
Code: Alles auswählen
switch(x) {
case 1: foo(); break;
case 2: bar(); break;
default: baz();
}
umzubauen. Ich habe das schon Stunden mit solchen optimierungen verbracht und das Ergebnis war praktisch immer: der generierte Code war identisch.
Inzwischen ist meine Meinung zum Thema: keine "Compileroptimierung" des Codes machen, weil das die Leute die die Compiler bauen meist besser können als ich.
Insbesondere mit modernen Architekturen ist es oft auch so, dass Code, der auf den ersten Blick "schlecht" aussieht u.U. besser performt, weil die Pipelines oder die "speculative execution" der Prozessoren besser genutzt werden etc.
Ich habe einige Jahre bei Compiler- und Toolchainspezialisten "um die Ecke" gesessen und die haben alle (im positiven Sinn ;) "mächtig einen an der Waffel". Ich bin mir ziemlich sicher, dass die das besser hinbekommen als wir alle zusammen :-)
Ich persönlich versuche meist, das so zu machen, dass der code möglichst verständlich bleibt. Sprich:
ich will die hälfte von was: y = x / 2;
ich will aus 2 char's einen short machen: y = (c[0] << 8) | c[1];
Beim 2. finde ich "(c[0] * 256) + c[1]" irgendwie schlechter lesbar, auch wenn am Ende dasselbe rauskommt. Ist aber auch Geschmackssache.