"Cyrille Karmann" a écrit dans le message de
news:Le rtti est très souvent activé par défaut sur les compilateurs. Et le
programmeur débutant qui apprendra bien plus tard ce qu'est le rtti se
retrouve sans comprendre pourquoi avec un exécutable faisant "Hello,
World!" qui est cinquante fois plus gros que son équivalent en C.
Je crois que c'est un peu là le problème: il y a dans C++ un certains
nombres de pièges à performances qu'on apprend à éviter mais dans lequel
tombe systématiquement le programmeur débutant. Il en ressort alors avec
l'impression fausse que "le C++ c'est plus lent".
Par exemple, quelqu'un qui veut faire un moteur 3D fera peut-être une
classe Vector pour représenter les vecteurs. Intuitivement, il fera
quelque chose comme ceci pour les opérations mathématiques:
Intuitivement, j'attendrais de quelqu'un qui veut faire un moteur 3D utilise
un langage qu'il connait bien...
// operator addition grossier
Vector operator + (Vector const&a, Vector const &b)
{
return Vector(a.x+b.x, a.y+b.y, a.z+b.z);
}
Cette implémentation comporte un piège: la création d'un objet
temporaire qui va être créé et détruit et donc entrainer une perte de
temps. Si ensuite il écrit une ligne du genre:
Vector ret = a+b+c+d;
3 objets temporaires seront construits et détruits et prendront de la
ressource cpu. L'optimisation du compilateur n'y change pas grand chose,
surtout si les fonctions ne sont pas inline.
L'optimisation du compilateur n'y change pas grand chose peut-être, si ce
n'est d'éviter la création de ces temporaires...
L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca change
rien)
Ce qui change, c'est que la signature devient illisible, que tu vas soit
devoir déréférencer tes objets systématiquement pour les transmettre à la
fonction, soit (plus probablement hélas) utiliser des pointeur partout dans
ton code...
Mais ça c'est du pur C. Conclusion rapide: le C est plus rapide que le
C++. Or en fait la bonne conclusion devrait être: le bon C est plus
rapide que le mauvais C++. Le fait que beaucoup de programmeurs ayant à
peine touché le C++ fasse l'amalgame est à mon avis une cause de cette
mauvaise réputation du C++ pour les jeux.
Ta conclusion est juste bien que tes postulats soient faux (que le second
code est plus rapide que le premier)...
"Cyrille Karmann" <cyrille@frsf.org> a écrit dans le message de
news:GFr.19eba3c97b5a5e6b989962@news.free.fr...
Le rtti est très souvent activé par défaut sur les compilateurs. Et le
programmeur débutant qui apprendra bien plus tard ce qu'est le rtti se
retrouve sans comprendre pourquoi avec un exécutable faisant "Hello,
World!" qui est cinquante fois plus gros que son équivalent en C.
Je crois que c'est un peu là le problème: il y a dans C++ un certains
nombres de pièges à performances qu'on apprend à éviter mais dans lequel
tombe systématiquement le programmeur débutant. Il en ressort alors avec
l'impression fausse que "le C++ c'est plus lent".
Par exemple, quelqu'un qui veut faire un moteur 3D fera peut-être une
classe Vector pour représenter les vecteurs. Intuitivement, il fera
quelque chose comme ceci pour les opérations mathématiques:
Intuitivement, j'attendrais de quelqu'un qui veut faire un moteur 3D utilise
un langage qu'il connait bien...
// operator addition grossier
Vector operator + (Vector const&a, Vector const &b)
{
return Vector(a.x+b.x, a.y+b.y, a.z+b.z);
}
Cette implémentation comporte un piège: la création d'un objet
temporaire qui va être créé et détruit et donc entrainer une perte de
temps. Si ensuite il écrit une ligne du genre:
Vector ret = a+b+c+d;
3 objets temporaires seront construits et détruits et prendront de la
ressource cpu. L'optimisation du compilateur n'y change pas grand chose,
surtout si les fonctions ne sont pas inline.
L'optimisation du compilateur n'y change pas grand chose peut-être, si ce
n'est d'éviter la création de ces temporaires...
L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca change
rien)
Ce qui change, c'est que la signature devient illisible, que tu vas soit
devoir déréférencer tes objets systématiquement pour les transmettre à la
fonction, soit (plus probablement hélas) utiliser des pointeur partout dans
ton code...
Mais ça c'est du pur C. Conclusion rapide: le C est plus rapide que le
C++. Or en fait la bonne conclusion devrait être: le bon C est plus
rapide que le mauvais C++. Le fait que beaucoup de programmeurs ayant à
peine touché le C++ fasse l'amalgame est à mon avis une cause de cette
mauvaise réputation du C++ pour les jeux.
Ta conclusion est juste bien que tes postulats soient faux (que le second
code est plus rapide que le premier)...
"Cyrille Karmann" a écrit dans le message de
news:Le rtti est très souvent activé par défaut sur les compilateurs. Et le
programmeur débutant qui apprendra bien plus tard ce qu'est le rtti se
retrouve sans comprendre pourquoi avec un exécutable faisant "Hello,
World!" qui est cinquante fois plus gros que son équivalent en C.
Je crois que c'est un peu là le problème: il y a dans C++ un certains
nombres de pièges à performances qu'on apprend à éviter mais dans lequel
tombe systématiquement le programmeur débutant. Il en ressort alors avec
l'impression fausse que "le C++ c'est plus lent".
Par exemple, quelqu'un qui veut faire un moteur 3D fera peut-être une
classe Vector pour représenter les vecteurs. Intuitivement, il fera
quelque chose comme ceci pour les opérations mathématiques:
Intuitivement, j'attendrais de quelqu'un qui veut faire un moteur 3D utilise
un langage qu'il connait bien...
// operator addition grossier
Vector operator + (Vector const&a, Vector const &b)
{
return Vector(a.x+b.x, a.y+b.y, a.z+b.z);
}
Cette implémentation comporte un piège: la création d'un objet
temporaire qui va être créé et détruit et donc entrainer une perte de
temps. Si ensuite il écrit une ligne du genre:
Vector ret = a+b+c+d;
3 objets temporaires seront construits et détruits et prendront de la
ressource cpu. L'optimisation du compilateur n'y change pas grand chose,
surtout si les fonctions ne sont pas inline.
L'optimisation du compilateur n'y change pas grand chose peut-être, si ce
n'est d'éviter la création de ces temporaires...
L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca change
rien)
Ce qui change, c'est que la signature devient illisible, que tu vas soit
devoir déréférencer tes objets systématiquement pour les transmettre à la
fonction, soit (plus probablement hélas) utiliser des pointeur partout dans
ton code...
Mais ça c'est du pur C. Conclusion rapide: le C est plus rapide que le
C++. Or en fait la bonne conclusion devrait être: le bon C est plus
rapide que le mauvais C++. Le fait que beaucoup de programmeurs ayant à
peine touché le C++ fasse l'amalgame est à mon avis une cause de cette
mauvaise réputation du C++ pour les jeux.
Ta conclusion est juste bien que tes postulats soient faux (que le second
code est plus rapide que le premier)...
Fred disait...
"Cyrille Karmann" a écrit dans le message de news:
L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca
change
rien)
const est un mot cle C?
Aux dernières nouvelles, c'est un mot clé de C.
Fred disait...
"Cyrille Karmann" <cyrille@frsf.org> a écrit dans le message de news:
GFr.19eba3c97b5a5e6b989962@news.free.fr...
L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca
change
rien)
const est un mot cle C?
Aux dernières nouvelles, c'est un mot clé de C.
Fred disait...
"Cyrille Karmann" a écrit dans le message de news:
L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca
change
rien)
const est un mot cle C?
Aux dernières nouvelles, c'est un mot clé de C.
"Cyrille Karmann" a écrit dans le message de news:L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca
changerien)
const est un mot cle C?
Aux dernières nouvelles, c'est un mot clé de C.
Tu m'apprends un truc la.
"Cyrille Karmann" <cyrille@frsf.org> a écrit dans le message de news:
GFr.19ebad5ce53c14a8989964@news.free.fr...
L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca
change
rien)
const est un mot cle C?
Aux dernières nouvelles, c'est un mot clé de C.
Tu m'apprends un truc la.
"Cyrille Karmann" a écrit dans le message de news:L'alternative la plus simple est alors d'écrire:
void AdditionneVecteurs(Vector *out, Vector const *in1, Vector const
*in2);
(ou l'équivalent avec des références à la place des pointeurs. Ca
changerien)
const est un mot cle C?
Aux dernières nouvelles, c'est un mot clé de C.
Tu m'apprends un truc la.
Richard Delorme wrote:Bien sûr un programme C compatible C++ fonctionne à la même vitesse que
le compilateur soit en mode C ou C++. Néanmoins les approches offertes
par le C++, comme la programmation objet, générique,... peuvent conduire
à un programme légèrement plus lent,
Heuh... En quoi la généricité rendrait-elle plus lent ?
Quand à l'objet, je vois pas non plus pourquoi il serait
plus lent (à moins de, comme aiment à le faire certains
en découvrant C++, d'ajouter du virtual partout).
En plus, le système est souvent (Unix + X11, Windows, openGL, ...) écrit
en C à la base, et l'utilisation du C++ invite à écrire une surcouche
objet dessus qui introduit un peu de lenteur.
Hum... La encore, je demande à voir pourquoi une surcouche objet
introduirait quoi que ce soit de lenteur.
Richard Delorme wrote:
Bien sûr un programme C compatible C++ fonctionne à la même vitesse que
le compilateur soit en mode C ou C++. Néanmoins les approches offertes
par le C++, comme la programmation objet, générique,... peuvent conduire
à un programme légèrement plus lent,
Heuh... En quoi la généricité rendrait-elle plus lent ?
Quand à l'objet, je vois pas non plus pourquoi il serait
plus lent (à moins de, comme aiment à le faire certains
en découvrant C++, d'ajouter du virtual partout).
En plus, le système est souvent (Unix + X11, Windows, openGL, ...) écrit
en C à la base, et l'utilisation du C++ invite à écrire une surcouche
objet dessus qui introduit un peu de lenteur.
Hum... La encore, je demande à voir pourquoi une surcouche objet
introduirait quoi que ce soit de lenteur.
Richard Delorme wrote:Bien sûr un programme C compatible C++ fonctionne à la même vitesse que
le compilateur soit en mode C ou C++. Néanmoins les approches offertes
par le C++, comme la programmation objet, générique,... peuvent conduire
à un programme légèrement plus lent,
Heuh... En quoi la généricité rendrait-elle plus lent ?
Quand à l'objet, je vois pas non plus pourquoi il serait
plus lent (à moins de, comme aiment à le faire certains
en découvrant C++, d'ajouter du virtual partout).
En plus, le système est souvent (Unix + X11, Windows, openGL, ...) écrit
en C à la base, et l'utilisation du C++ invite à écrire une surcouche
objet dessus qui introduit un peu de lenteur.
Hum... La encore, je demande à voir pourquoi une surcouche objet
introduirait quoi que ce soit de lenteur.
Parce qu'elle prend en compte tous les cas de figure, tandis que, le plus
souvent, on n'a que des cas particuliers à traiter.
Un des problèmes de l'objet, c'est qu'il y a des appels de fonction
implicite, fait à l'insu du plein gré du programmeur (constructeur,
destructeur, ...), en particulier lorsque des objets temporaires sont
créés.
Parce qu'elle prend en compte tous les cas de figure, tandis que, le plus
souvent, on n'a que des cas particuliers à traiter.
Un des problèmes de l'objet, c'est qu'il y a des appels de fonction
implicite, fait à l'insu du plein gré du programmeur (constructeur,
destructeur, ...), en particulier lorsque des objets temporaires sont
créés.
Parce qu'elle prend en compte tous les cas de figure, tandis que, le plus
souvent, on n'a que des cas particuliers à traiter.
Un des problèmes de l'objet, c'est qu'il y a des appels de fonction
implicite, fait à l'insu du plein gré du programmeur (constructeur,
destructeur, ...), en particulier lorsque des objets temporaires sont
créés.
~Vector() { std::cout << "destructeur" << endl; }
Vector ret = a+b+c+d;
}
... appelle 7 fois le destructeur de Vector, soit deux fois de trop (gcc
3.2).
~Vector() { std::cout << "destructeur" << endl; }
Vector ret = a+b+c+d;
}
... appelle 7 fois le destructeur de Vector, soit deux fois de trop (gcc
3.2).
~Vector() { std::cout << "destructeur" << endl; }
Vector ret = a+b+c+d;
}
... appelle 7 fois le destructeur de Vector, soit deux fois de trop (gcc
3.2).
Je travaille moi aussi dans le jeu vidéo et c'est ce que j'ai toujours
entendu...
Je travaille moi aussi dans le jeu vidéo et c'est ce que j'ai toujours
entendu...
Je travaille moi aussi dans le jeu vidéo et c'est ce que j'ai toujours
entendu...
On Mon, 6 Oct 2003 18:15:42 +0200, Cyrille Karmann
wrote:~Vector() { std::cout << "destructeur" << endl; }Vector ret = a+b+c+d;
}
... appelle 7 fois le destructeur de Vector, soit deux fois de trop (gcc
3.2).
Oui, mais là le destructeur a un effet de bord, donc le compilo ne
peut pas optimiser en virant certains temporaires.
On Mon, 6 Oct 2003 18:15:42 +0200, Cyrille Karmann <cyrille@frsf.org>
wrote:
~Vector() { std::cout << "destructeur" << endl; }
Vector ret = a+b+c+d;
}
... appelle 7 fois le destructeur de Vector, soit deux fois de trop (gcc
3.2).
Oui, mais là le destructeur a un effet de bord, donc le compilo ne
peut pas optimiser en virant certains temporaires.
On Mon, 6 Oct 2003 18:15:42 +0200, Cyrille Karmann
wrote:~Vector() { std::cout << "destructeur" << endl; }Vector ret = a+b+c+d;
}
... appelle 7 fois le destructeur de Vector, soit deux fois de trop (gcc
3.2).
Oui, mais là le destructeur a un effet de bord, donc le compilo ne
peut pas optimiser en virant certains temporaires.
Oui, mais là le destructeur a un effet de bord, donc le compilo ne
peut pas optimiser en virant certains temporaires.
HAHA! C'est donc pas si simple! ;-)
Oui, mais là le destructeur a un effet de bord, donc le compilo ne
peut pas optimiser en virant certains temporaires.
HAHA! C'est donc pas si simple! ;-)
Oui, mais là le destructeur a un effet de bord, donc le compilo ne
peut pas optimiser en virant certains temporaires.
HAHA! C'est donc pas si simple! ;-)