Optimisation du constructeur de copie en C
En C , dans des circonstances spécifiques, le constructeur de copie peut ne pas être invoqué, ce qui soulève des questions sur l'optimisation du compilateur ou les fonctionnalités non documentées de la langue.
Considérez ce qui suit code :
class A { public: A(int value) : value_(value) { cout << "Regular constructor" << endl; } A(const A& other) : value_(other.value_) { cout << "Copy constructor" << endl; } private: int value_; }; int main() { A a = A(5); }
On pourrait s'attendre à ce que la sortie inclue à la fois les messages "Constructeur régulier" et "Constructeur de copie". Cependant, dans ce cas, le constructeur de copie n'est jamais appelé.
Ce comportement n'est ni une optimisation du compilateur ni une fonctionnalité non documentée de C . Au lieu de cela, il est explicitement spécifié dans la norme C (§12.8.15) que les affectations comme T = x ; peut être interprété comme T(x);, éliminant efficacement le T interne lorsqu'une copie n'est pas nécessaire.
Dans ce cas particulier, le compilateur reconnaît que construire un objet A puis le copier est redondant et omet donc l'appel du constructeur de copie.
Pour appliquer l'invocation du constructeur de copie, on peut créer explicitement le premier objet A :
A a; // Construct an empty A object a = A(5); // Copy-initialize it with another A object
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!