En fait, je voudrais savoir si ce comportement est standard, ou si c'est
une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
En fait, je voudrais savoir si ce comportement est standard, ou si c'est
une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
En fait, je voudrais savoir si ce comportement est standard, ou si c'est
une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
Bonjour à tous.
Lors d'une initialisation d'un objet à l'aide d'un retour de fonction,
j'ai remarqué que (sous gcc), ni le constructeur de copie, ni
l'opérateur d'affectation n'étaient invoqués. Il y a (je crois) juste
un "branchement" entre la variable crée dans le corps de la fonction
et le nouvel objet.
En fait, je voudrais savoir si ce comportement est standard, ou si
c'est une optimisation du compilateur.
C'est autorisé spécifiquement par la norme (12.8/15). C'est la "NRVO" (Named
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
Effectivement, cette optimisation peut entrainer des changements de
Bonjour à tous.
Lors d'une initialisation d'un objet à l'aide d'un retour de fonction,
j'ai remarqué que (sous gcc), ni le constructeur de copie, ni
l'opérateur d'affectation n'étaient invoqués. Il y a (je crois) juste
un "branchement" entre la variable crée dans le corps de la fonction
et le nouvel objet.
En fait, je voudrais savoir si ce comportement est standard, ou si
c'est une optimisation du compilateur.
C'est autorisé spécifiquement par la norme (12.8/15). C'est la "NRVO" (Named
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
Effectivement, cette optimisation peut entrainer des changements de
Bonjour à tous.
Lors d'une initialisation d'un objet à l'aide d'un retour de fonction,
j'ai remarqué que (sous gcc), ni le constructeur de copie, ni
l'opérateur d'affectation n'étaient invoqués. Il y a (je crois) juste
un "branchement" entre la variable crée dans le corps de la fonction
et le nouvel objet.
En fait, je voudrais savoir si ce comportement est standard, ou si
c'est une optimisation du compilateur.
C'est autorisé spécifiquement par la norme (12.8/15). C'est la "NRVO" (Named
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
Effectivement, cette optimisation peut entrainer des changements de
Lors d'une initialisation d'un objet à l'aide d'un retour de
fonction, j'ai remarqué que (sous gcc), ni le constructeur de
copie, ni l'opérateur d'affectation n'étaient invoqués. Il y a
(je crois) juste un "branchement" entre la variable crée dans
le corps de la fonction et le nouvel objet.
En fait, je voudrais savoir si ce comportement est standard,
ou si c'est une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à
proscrire, étant donné qu'on perd le contrôle de
l'opérateur= ?
Ci-joint mon bout de code :
#include <iostream>
using namespace std;
class X
{
public:
int i;
X() {cout << "constructeurn";}
X(int a) : i(a) {cout << "constructeur intn";}
X(const X& x) : i(x.i) {cout << "constructeur copien";};
X f(int a);
X &operator=(const X &x) {cout << "affectationn"; i = x.i; return
*this;}
};
X X::f(int a)
{
X x(a);
return x;
}
int main()
{
X x1(1); // appel au constructeur (entier)
X x2 = x1; // appel au constructeur par copie
X x3(2); // appel au constructeur (entier)
x3 = x1; // appel a l'operateur d'affectation
X x4 = x1.f(3); // appel a... rien
}
Lors d'une initialisation d'un objet à l'aide d'un retour de
fonction, j'ai remarqué que (sous gcc), ni le constructeur de
copie, ni l'opérateur d'affectation n'étaient invoqués. Il y a
(je crois) juste un "branchement" entre la variable crée dans
le corps de la fonction et le nouvel objet.
En fait, je voudrais savoir si ce comportement est standard,
ou si c'est une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à
proscrire, étant donné qu'on perd le contrôle de
l'opérateur= ?
Ci-joint mon bout de code :
#include <iostream>
using namespace std;
class X
{
public:
int i;
X() {cout << "constructeurn";}
X(int a) : i(a) {cout << "constructeur intn";}
X(const X& x) : i(x.i) {cout << "constructeur copien";};
X f(int a);
X &operator=(const X &x) {cout << "affectationn"; i = x.i; return
*this;}
};
X X::f(int a)
{
X x(a);
return x;
}
int main()
{
X x1(1); // appel au constructeur (entier)
X x2 = x1; // appel au constructeur par copie
X x3(2); // appel au constructeur (entier)
x3 = x1; // appel a l'operateur d'affectation
X x4 = x1.f(3); // appel a... rien
}
Lors d'une initialisation d'un objet à l'aide d'un retour de
fonction, j'ai remarqué que (sous gcc), ni le constructeur de
copie, ni l'opérateur d'affectation n'étaient invoqués. Il y a
(je crois) juste un "branchement" entre la variable crée dans
le corps de la fonction et le nouvel objet.
En fait, je voudrais savoir si ce comportement est standard,
ou si c'est une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à
proscrire, étant donné qu'on perd le contrôle de
l'opérateur= ?
Ci-joint mon bout de code :
#include <iostream>
using namespace std;
class X
{
public:
int i;
X() {cout << "constructeurn";}
X(int a) : i(a) {cout << "constructeur intn";}
X(const X& x) : i(x.i) {cout << "constructeur copien";};
X f(int a);
X &operator=(const X &x) {cout << "affectationn"; i = x.i; return
*this;}
};
X X::f(int a)
{
X x(a);
return x;
}
int main()
{
X x1(1); // appel au constructeur (entier)
X x2 = x1; // appel au constructeur par copie
X x3(2); // appel au constructeur (entier)
x3 = x1; // appel a l'operateur d'affectation
X x4 = x1.f(3); // appel a... rien
}
En gros, l'idée est que si, en tant qu'utilisateur,
tes constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
En gros, l'idée est que si, en tant qu'utilisateur,
tes constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
En gros, l'idée est que si, en tant qu'utilisateur,
tes constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
En gros, l'idée est que si, en tant qu'utilisateur,
tes constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
C'est dommage, j'ai l'impression que c'est une réelle restriction du
C++. Finalement, les concepteurs de la norme ont décidé que le
constructeur de copie doit faire ce qu'il est censé faire. Sous pretexte
qu'un programme bien écrit doit le faire.
On se retrouve dans la position du Java : conçu après le C++, il s'est
attaché à supprimer les fonctionnalités qui peuvent causer désordre dans
un programme. Pour arriver AMHA à un langage évolué plutôt fade, mais
productif. Sans grand intérêt pour un développeur enthousiaste, mais
d'un grand intérêt pour une société en cherche de profit.
Comment être sûr que le constructeur de copie ne pourrait être employé
quelque part, dans un programme joyeusement atypique, à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait s'extasier
"Waou, c'est joli ça". Et hop, sous une contrainte de portabilité, les
rêves s'envolent. Je caricature, mais bon...
En gros, l'idée est que si, en tant qu'utilisateur,
tes constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
C'est dommage, j'ai l'impression que c'est une réelle restriction du
C++. Finalement, les concepteurs de la norme ont décidé que le
constructeur de copie doit faire ce qu'il est censé faire. Sous pretexte
qu'un programme bien écrit doit le faire.
On se retrouve dans la position du Java : conçu après le C++, il s'est
attaché à supprimer les fonctionnalités qui peuvent causer désordre dans
un programme. Pour arriver AMHA à un langage évolué plutôt fade, mais
productif. Sans grand intérêt pour un développeur enthousiaste, mais
d'un grand intérêt pour une société en cherche de profit.
Comment être sûr que le constructeur de copie ne pourrait être employé
quelque part, dans un programme joyeusement atypique, à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait s'extasier
"Waou, c'est joli ça". Et hop, sous une contrainte de portabilité, les
rêves s'envolent. Je caricature, mais bon...
En gros, l'idée est que si, en tant qu'utilisateur,
tes constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
C'est dommage, j'ai l'impression que c'est une réelle restriction du
C++. Finalement, les concepteurs de la norme ont décidé que le
constructeur de copie doit faire ce qu'il est censé faire. Sous pretexte
qu'un programme bien écrit doit le faire.
On se retrouve dans la position du Java : conçu après le C++, il s'est
attaché à supprimer les fonctionnalités qui peuvent causer désordre dans
un programme. Pour arriver AMHA à un langage évolué plutôt fade, mais
productif. Sans grand intérêt pour un développeur enthousiaste, mais
d'un grand intérêt pour une société en cherche de profit.
Comment être sûr que le constructeur de copie ne pourrait être employé
quelque part, dans un programme joyeusement atypique, à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait s'extasier
"Waou, c'est joli ça". Et hop, sous une contrainte de portabilité, les
rêves s'envolent. Je caricature, mais bon...
Comment être sûr que le constructeur de copie ne pourrait être employé
quelque part, dans un programme joyeusement atypique, à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait s'extasier
"Waou, c'est joli ça". Et hop, sous une contrainte de portabilité, les
rêves s'envolent. Je caricature, mais bon...
man g++
GCC(1) GNU Tools
more testNRVO.cpp
#include <iostream>
g++ testNRVO.cpp
./a.out
Constructor
g++ -fno-elide-constructors testNRVO.cpp
./a.out
Constructor
Comment être sûr que le constructeur de copie ne pourrait être employé
quelque part, dans un programme joyeusement atypique, à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait s'extasier
"Waou, c'est joli ça". Et hop, sous une contrainte de portabilité, les
rêves s'envolent. Je caricature, mais bon...
man g++
GCC(1) GNU Tools
more testNRVO.cpp
#include <iostream>
g++ testNRVO.cpp
./a.out
Constructor
g++ -fno-elide-constructors testNRVO.cpp
./a.out
Constructor
Comment être sûr que le constructeur de copie ne pourrait être employé
quelque part, dans un programme joyeusement atypique, à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait s'extasier
"Waou, c'est joli ça". Et hop, sous une contrainte de portabilité, les
rêves s'envolent. Je caricature, mais bon...
man g++
GCC(1) GNU Tools
more testNRVO.cpp
#include <iostream>
g++ testNRVO.cpp
./a.out
Constructor
g++ -fno-elide-constructors testNRVO.cpp
./a.out
Constructor
En gros, l'idée est que si, en tant qu'utilisateur, tes
constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
C'est dommage, j'ai l'impression que c'est une réelle
restriction du C++. Finalement, les concepteurs de la norme
ont décidé que le constructeur de copie doit faire ce qu'il
est censé faire. Sous pretexte qu'un programme bien écrit doit
le faire.
On se retrouve dans la position du Java : conçu après le C++,
il s'est attaché à supprimer les fonctionnalités qui peuvent
causer désordre dans un programme.
Pour arriver AMHA à un langage évolué plutôt fade, mais
productif. Sans grand intérêt pour un développeur
enthousiaste, mais d'un grand intérêt pour une société en
cherche de profit.
Comment être sûr que le constructeur de copie ne pourrait être
employé quelque part, dans un programme joyeusement atypique,
à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait
s'extasier "Waou, c'est joli ça". Et hop, sous une contrainte
de portabilité, les rêves s'envolent. Je caricature, mais
bon...
En gros, l'idée est que si, en tant qu'utilisateur, tes
constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
C'est dommage, j'ai l'impression que c'est une réelle
restriction du C++. Finalement, les concepteurs de la norme
ont décidé que le constructeur de copie doit faire ce qu'il
est censé faire. Sous pretexte qu'un programme bien écrit doit
le faire.
On se retrouve dans la position du Java : conçu après le C++,
il s'est attaché à supprimer les fonctionnalités qui peuvent
causer désordre dans un programme.
Pour arriver AMHA à un langage évolué plutôt fade, mais
productif. Sans grand intérêt pour un développeur
enthousiaste, mais d'un grand intérêt pour une société en
cherche de profit.
Comment être sûr que le constructeur de copie ne pourrait être
employé quelque part, dans un programme joyeusement atypique,
à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait
s'extasier "Waou, c'est joli ça". Et hop, sous une contrainte
de portabilité, les rêves s'envolent. Je caricature, mais
bon...
En gros, l'idée est que si, en tant qu'utilisateur, tes
constructeurs de copie ne font que copier, sans effets de
bord, et que l'identité de l'objet n'a pas d'importance, tu ne
dois pas pouvoir s'apperçois de l'optimisation.
C'est dommage, j'ai l'impression que c'est une réelle
restriction du C++. Finalement, les concepteurs de la norme
ont décidé que le constructeur de copie doit faire ce qu'il
est censé faire. Sous pretexte qu'un programme bien écrit doit
le faire.
On se retrouve dans la position du Java : conçu après le C++,
il s'est attaché à supprimer les fonctionnalités qui peuvent
causer désordre dans un programme.
Pour arriver AMHA à un langage évolué plutôt fade, mais
productif. Sans grand intérêt pour un développeur
enthousiaste, mais d'un grand intérêt pour une société en
cherche de profit.
Comment être sûr que le constructeur de copie ne pourrait être
employé quelque part, dans un programme joyeusement atypique,
à autre chose ?
Arriver à un bout de code, une idée, sur lesquels on pourrait
s'extasier "Waou, c'est joli ça". Et hop, sous une contrainte
de portabilité, les rêves s'envolent. Je caricature, mais
bon...
Bonjour à tous.
Lors d'une initialisation d'un objet à l'aide d'un retour de fonction,
j'ai remarqué que (sous gcc), ni le constructeur de copie, ni
l'opérateur d'affectation n'étaient invoqués. Il y a (je crois) juste un
"branchement" entre la variable crée dans le corps de la fonction et le
nouvel objet.
En fait, je voudrais savoir si ce comportement est standard, ou si c'est
une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
Ci-joint mon bout de code :
#include <iostream>
using namespace std;
class X
{
public:
int i;
X() {cout << "constructeurn";}
X(int a) : i(a) {cout << "constructeur intn";}
X(const X& x) : i(x.i) {cout << "constructeur copien";};
X f(int a);
X &operator=(const X &x) {cout << "affectationn"; i = x.i; return
*this;}
};
X X::f(int a)
{
X x(a);
return x;
}
int main()
{
X x1(1); // appel au constructeur (entier)
X x2 = x1; // appel au constructeur par copie
X x3(2); // appel au constructeur (entier)
x3 = x1; // appel a l'operateur d'affectation
X x4 = x1.f(3); // appel a... rien
}
Bonjour à tous.
Lors d'une initialisation d'un objet à l'aide d'un retour de fonction,
j'ai remarqué que (sous gcc), ni le constructeur de copie, ni
l'opérateur d'affectation n'étaient invoqués. Il y a (je crois) juste un
"branchement" entre la variable crée dans le corps de la fonction et le
nouvel objet.
En fait, je voudrais savoir si ce comportement est standard, ou si c'est
une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
Ci-joint mon bout de code :
#include <iostream>
using namespace std;
class X
{
public:
int i;
X() {cout << "constructeurn";}
X(int a) : i(a) {cout << "constructeur intn";}
X(const X& x) : i(x.i) {cout << "constructeur copien";};
X f(int a);
X &operator=(const X &x) {cout << "affectationn"; i = x.i; return
*this;}
};
X X::f(int a)
{
X x(a);
return x;
}
int main()
{
X x1(1); // appel au constructeur (entier)
X x2 = x1; // appel au constructeur par copie
X x3(2); // appel au constructeur (entier)
x3 = x1; // appel a l'operateur d'affectation
X x4 = x1.f(3); // appel a... rien
}
Bonjour à tous.
Lors d'une initialisation d'un objet à l'aide d'un retour de fonction,
j'ai remarqué que (sous gcc), ni le constructeur de copie, ni
l'opérateur d'affectation n'étaient invoqués. Il y a (je crois) juste un
"branchement" entre la variable crée dans le corps de la fonction et le
nouvel objet.
En fait, je voudrais savoir si ce comportement est standard, ou si c'est
une optimisation du compilateur.
Dans tous les cas, ce type de declaration n'est-il pas à proscrire,
étant donné qu'on perd le contrôle de l'opérateur = ?
Ci-joint mon bout de code :
#include <iostream>
using namespace std;
class X
{
public:
int i;
X() {cout << "constructeurn";}
X(int a) : i(a) {cout << "constructeur intn";}
X(const X& x) : i(x.i) {cout << "constructeur copien";};
X f(int a);
X &operator=(const X &x) {cout << "affectationn"; i = x.i; return
*this;}
};
X X::f(int a)
{
X x(a);
return x;
}
int main()
{
X x1(1); // appel au constructeur (entier)
X x2 = x1; // appel au constructeur par copie
X x3(2); // appel au constructeur (entier)
x3 = x1; // appel a l'operateur d'affectation
X x4 = x1.f(3); // appel a... rien
}