Supposons que j'ai une classe commeEst-ce que l'appel du constructeur d'une classe vide utilise réellement de la mémoire?
class Empty{
Empty(int a){ cout << a; }
}
Et puis je l'invoquons en utilisant
int main(){
Empty(2);
return 0;
}
Est-ce que cette cause une mémoire à allouer sur la pile pour la création d'un objet « vide »? Évidemment, les arguments doivent être poussés sur la pile, mais je ne veux pas encourir de frais supplémentaires. Fondamentalement, j'utilise le constructeur en tant que membre statique.
La raison pour laquelle je veux faire cela est à cause de modèles. Le code actuel ressemble
template <int which>
class FuncName{
template <class T>
FuncName(const T &value){
if(which == 1){
// specific behavior
}else if(which == 2){
// other specific behavior
}
}
};
qui me permet d'écrire quelque chose comme
int main(){
int a = 1;
FuncName<1>(a);
}
pour que je sois à se spécialiser un paramètre de modèle, sans avoir à spécifier le type de T
. En outre, j'espère que le compilateur optimisera les autres branches à l'intérieur du constructeur. Si quelqu'un sait si c'est vrai ou comment vérifier, ce serait grandement apprécié. J'ai supposé aussi que jeter des modèles dans la situation ne change pas le problème de la "classe vide" d'en haut, n'est-ce pas?
La question est de savoir pourquoi cela vous intéresse.C'est le travail du compilateur de prendre soin et de générer le meilleur code. Vous devriez vous concentrer sur l'écriture du code le plus expressif. –
PS. Il n'y a aucune exigence pour que l'argument soit poussé sur la pile. L'ABI C++ n'est pas défini de façon délibérée, de sorte que les compilateurs ont la possibilité d'utiliser register pour transmettre des paramètres si cela rend le code plus efficace. –
Je m'en soucie parce que je veux obtenir la meilleure performance possible; Je déteste vraiment l'attitude que le code devrait être élégant et ne pas s'inquiéter de ces choses. Parfois, ces choses comptent (je fais du calcul haute performance). –