Funktionsparameter effizient anlegen
-
Naja, Du hättest einfach:
void foo (int Arg1, int Arg2, int Arg3) { static BAR * foobar = Calloc(10, sizeof(TEST)); // ... }
machen können ...
-
Ne, das hatte schon seinen Sinn; wenn ich es mache, wie Du sagst, kommt bei mir:
compiler schrieb:
error : static/external initializers must be constant expressions
-
Schock schrieb:
Ne, das hatte schon seinen Sinn; wenn ich es mache, wie Du sagst, kommt bei mir:
compiler schrieb:
error : static/external initializers must be constant expressions
Oh, ach ja.
Das geht ja nur in C++, nicht in C. Tut mir leid, dann war die if-Abfrage doch sinnvoll. Solche Detailsunterschiede bei wenig genutzten Sprachfeatures entfallen mir manchmal.
Aber, wie schon geklärt, sollte man diese Variante ohnehin nicht benutzen.
-
Okay, wusste ich auch nicht, dass das in C nicht klappt ...
-
Belli schrieb:
void foo (int Arg1, int Arg2, int Arg3) { static struct BAR foobar[10];
}
Lokalstatische Variablen verhindern ein sinnvolles Inlining durch den Compiler und sind somit auch aus diesem Grund Schrott.
-
Dieses 'Inlining' ist mir nur von C++ bekannt, ist demnach in diesem Kontext vermutlich was völlig anderes?
-
Inlining ist ein gängiges Optimierungsverfahren vieler Compiler vieler Programmiersprachen für performanteren Code, und, ja, auch C Compiler können C Code optimieren und sie taten das schon lange bevor irgendjemand an C++ dachte.
-
Belli schrieb:
Dieses 'Inlining' ist mir nur von C++ bekannt, ist demnach in diesem Kontext vermutlich was völlig anderes?
Es geht um das "richtige" Inlining, nicht bloß das Schlüsselwort in seinem semantischen Sinn (Mehrfachdefinition verhindern). Also das tatsächliche Einsparen eines Funktionsaufrufs, indem der Code der Funktion an der Stelle des Aufrufs eingesetzt wird.
Das ist es, was ich weiter oben mit
SeppJ schrieb:
selbst einfache Optimierungen werden erheblich erschwert oder verhindert.
meinte. Verhinderung von Inlining ist (bei kleinen Funktionen) eine ganz gewaltige Performancebremse. Es ist eine der einfachsten und effizientesten Optimierungen überhaupt und wird von vielen Compilern (egal welche Sprache) automatisch durchgeführt.
edit: Zu langsam...
-
Macht der Compiler das bei jeder Funktion? Auch die in *.cpp Dateien?
-
Nathan schrieb:
Macht der Compiler das bei jeder Funktion? Auch die in *.cpp Dateien?
Kommt drauf an wie gut er ist. Erst einmal sind Dateien schon lange Schall und Rauch, wenn der Optimierer dran kommt (Dateien existieren sogar schon nach der allerersten Übersetzungsphase, dem Präprozessor, nicht mehr). Da gibt es keine Unterscheidung nach Headern oder Source.
Falls du das Inlining über verschiedene Quelltextmodule hinweg meinst: Ein wichtiges Stichwort, das in den letzten Jahren zur Standardausrüstung bei der Optimierung geworden ist, lautet:
http://en.wikipedia.org/wiki/Link-time_optimization