Angenommen, ich eine Klasse wieWird beim Aufruf des Konstruktors einer leeren Klasse tatsächlich Speicher verwendet?
class Empty{
Empty(int a){ cout << a; }
}
haben Und dann rufe ich es mit
int main(){
Empty(2);
return 0;
}
Wird diese Ursache jeder Speicher auf dem Stapel für die Schaffung eines „leeren“ Objekt zugewiesen werden? Offensichtlich müssen die Argumente auf den Stapel geschoben werden, aber ich möchte keinen zusätzlichen Aufwand verursachen. Im Grunde benutze ich den Konstruktor als statisches Element.
Der Grund, warum ich dies tun möchte, ist wegen der Vorlagen. Der eigentliche Code sieht aus wie
template <int which>
class FuncName{
template <class T>
FuncName(const T &value){
if(which == 1){
// specific behavior
}else if(which == 2){
// other specific behavior
}
}
};
, die mich so etwas wie
int main(){
int a = 1;
FuncName<1>(a);
}
so schreiben können, dass ich ein Template-Parameter spezialisieren erhalten, obwohl sie nicht die Art von T
angeben zu müssen. Ich hoffe auch, dass der Compiler die anderen Zweige innerhalb des Konstruktors optimiert. Wenn jemand weiß, ob das wahr ist oder wie man es überprüft, würde das sehr geschätzt werden. Ich nahm auch an, dass das Werfen von Schablonen in die Situation das "leere Klassen" -Problem von oben nicht ändert, ist das richtig?
Die Frage ist, warum kümmert es dich.Es ist die Aufgabe des Compilers, den besten Code zu pflegen und zu generieren. Sie sollten sich darauf konzentrieren, den aussagekräftigsten Code zu schreiben. –
PS. Das Argument muss nicht auf den Stack geschoben werden. Die C++ - ABI ist delibatly nicht definiert, so dass Compiler die Möglichkeit haben, Register zu verwenden, um Parameter zu übergeben, wenn das den Code effizienter macht –
Ich interessiere mich, weil ich die höchste Leistung will, die ich bekommen kann; Ich hasse wirklich die Einstellung, dass Code elegant sein sollte und sich nicht um diese Dinge kümmern sollte. Manchmal sind diese Dinge wichtig (ich mache High Performance Computing). –