OVH Cloud OVH Cloud

Un doute existenciel a propos du parcours de liste dans une boucle 'for'

79 réponses
Avatar
meow
> for ( iterator it=3Dliste.begin() ; it!=3Dliste.end() ; ++it )

Question =E0 deux balles : A tous les coups, le compilo n'a aucun moyen
d'extraire la valeur de liste.end() une fois pour toute avant le d=E9but
de la boucle, du coup =E0 chaque it=E9ration de la boucle le programme se
retape l'appel =E0 liste.end() !
La question toute simple que je me pose est donc : est-ce que c'est pas
mieux de faire

> iterator end=3Dliste.end()
> for ( iterator it=3Dliste.begin() ; it!=3Dend ; ++it )

9 réponses

4 5 6 7 8
Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

[...]

| C++ templates are similar to type parameters, but are actually a
| form of macro-expansion, with very different properties.
| Luca Cardelli
|
| Il a raison, mais je trouve domage de ne pas examiner plus les propritétés
| des templates en C++.

De mon expérience, les templates C++ sont très mal compris du monde
académique en général -- il y a quelques exceptions ici et là.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

De sa propre bouche, il a apprit beaucoup de choses de Ada, en
particulier de ne pas copier Ada. De plus, selon ses propres
termes, lorsqu'il a proposé les paramètres « non-type », il a
rencontré *beaucoup* de résistance.


La conjonction de ces deux phrases est amusante: Ada a des paramètres non
types depuis au moins Ada83. Je viens d'aller vérifier car je me demandais
si ma mémoire était bonne.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > De sa propre bouche, il a apprit beaucoup de choses de Ada, en
| > particulier de ne pas copier Ada. De plus, selon ses propres
| > termes, lorsqu'il a proposé les paramètres « non-type », il a
| > rencontré *beaucoup* de résistance.
|
| La conjonction de ces deux phrases est amusante: Ada a des paramètres non
| types depuis au moins Ada83. Je viens d'aller vérifier car je me demandais
| si ma mémoire était bonne.

Je n'impliquais pas que BS ne savait pas que les paramètres
« non-types » existaient avant (je ne crois pas qu'il revendique avoir
inventé cela). Ce qu'il ne voulait pas faire comme Ada -- entre autres
-- c'est le modèle d'instantiation. Alex Stepanov (entre autres) avait
fait un lobbying très fort pour que les instantiations soient
explicites. Si BS s'était laissé convaincre, on n'aurait probablement
pas la STL -- ironiquement :-)
Je ne connais pas très bien Ada, mais l'un des problèmes avec les
paramètres non-types, c'est la conjonction de déduction d'arguments
template et la réduction de leurs valeurs. (Ce qui a été la source
d'une discussion fameuse entre BS et Dave MacQueen).

Considère

template<int N> struct X { };

template<int I, int J> X<I+J> f(X<I>, X<J>);
template<int I, int J> X<I-J> f(X<I>, X<J>);

La question est comment distinguer ces deux functions, en particulier
lorsqu'elles ont des types qui coincident (imagine les deux fonctions
sont dans des unités de traduction différentes). Selon ce que j'ai
compris, BS proposait le modèle actuel, mais d'autres soutenaient que
2+3 ne devrait pas être la même chose que 5. Est-ce que Ada a des
problèmes similaires ? Si oui, comment est-ce que c'est résolu ?

Ce qui concerne la résistance, elle était très forte dans la communauté C++.

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

| Gabriel Dos Reis writes:
|
| > De sa propre bouche, il a apprit beaucoup de choses de Ada, en
| > particulier de ne pas copier Ada. De plus, selon ses propres
| > termes, lorsqu'il a proposé les paramètres « non-type », il a
| > rencontré *beaucoup* de résistance.
|
| La conjonction de ces deux phrases est amusante: Ada a des paramètres non
| types depuis au moins Ada83. Je viens d'aller vérifier car je me demandais
| si ma mémoire était bonne.

Je n'impliquais pas que BS ne savait pas que les paramètres « non-types »
existaient avant (je ne crois pas qu'il revendique avoir inventé cela).


Je n'ai pas écrit cela. La conjonction des deux phrases est amusante parce
que c'est un point ou il a peut-être récupéré des choses d'Ada (ou pris son
inspiration ailleurs, je n'en sais rien), en tout cas où il n'y a pas une
volonté de ne pas copier Ada.

Ce qu'il ne voulait pas faire comme Ada -- entre autres -- c'est le
modèle d'instantiation. Alex Stepanov (entre autres) avait fait un
lobbying très fort pour que les instantiations soient explicites. Si BS
s'était laissé convaincre, on n'aurait probablement pas la STL --
ironiquement :-)


Cela fait longtemps que je préfère les templates de C++ (entre autres à
cause de l'instaniation implicite et des spécialisations explicites) à la
généricité d'Ada, mais j'avoue que j'ai suivi -- avec du retard -- le
chemin de Stepanov: l'instantiation implicite me génait aussi quand je me
suis mis au C++. Depuis cela m'est arrivé de défendre les templates de C++
sur comp.lang.ada (que je ne lis plus depuis des années; pendant un temps
je travaillais en C++ au boulot et j'utilisais Ada pour mes petits projets
perso, ce n'est plus le cas).

Je ne connais pas très bien Ada, mais l'un des problèmes avec les
paramètres non-types, c'est la conjonction de déduction d'arguments
template et la réduction de leurs valeurs. (Ce qui a été la source
d'une discussion fameuse entre BS et Dave MacQueen).

Considère

template<int N> struct X { };

template<int I, int J> X<I+J> f(X<I>, X<J>);
template<int I, int J> X<I-J> f(X<I>, X<J>);

La question est comment distinguer ces deux functions, en particulier
lorsqu'elles ont des types qui coincident (imagine les deux fonctions
sont dans des unités de traduction différentes). Selon ce que j'ai
compris, BS proposait le modèle actuel, mais d'autres soutenaient que
2+3 ne devrait pas être la même chose que 5.


Je me demande quel modèle ils avaient.

Est-ce que Ada a des
problèmes similaires ? Si oui, comment est-ce que c'est résolu ?


Le problème ne se pose pas: toutes les "spécialisations" sont explicites et
nommées. L'effet est un peu comme si en C++ tu n'avais qu'un paramètre
template et que tu emploies systématiquement des traits, que tu ais besoin
de plusieurs paramètres ou pas. Tu peux donc instancier plusieurs fois
avec les mêmes paramètres en donnant des noms différents; des choses comme
les membres statiques ne sont pas partagées.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:

[...]

| > Je ne connais pas très bien Ada, mais l'un des problèmes avec les
| > paramètres non-types, c'est la conjonction de déduction d'arguments
| > template et la réduction de leurs valeurs. (Ce qui a été la source
| > d'une discussion fameuse entre BS et Dave MacQueen).
| >
| > Considère
| >
| > template<int N> struct X { };
| >
| > template<int I, int J> X<I+J> f(X<I>, X<J>);
| > template<int I, int J> X<I-J> f(X<I>, X<J>);
| >
| > La question est comment distinguer ces deux functions, en particulier
| > lorsqu'elles ont des types qui coincident (imagine les deux fonctions
| > sont dans des unités de traduction différentes). Selon ce que j'ai
| > compris, BS proposait le modèle actuel, mais d'autres soutenaient que
| > 2+3 ne devrait pas être la même chose que 5.
|
| Je me demande quel modèle ils avaient.

Ben "2+3" et "5" ne designent pas la même valeur -- ce qui veut dire
qu'on ne peut pas faire des joujoux avec des « meta-programes » :-)

| > Est-ce que Ada a des
| > problèmes similaires ? Si oui, comment est-ce que c'est résolu ?
|
| Le problème ne se pose pas: toutes les "spécialisations" sont explicites et
| nommées. L'effet est un peu comme si en C++ tu n'avais qu'un paramètre
| template et que tu emploies systématiquement des traits, que tu ais besoin
| de plusieurs paramètres ou pas. Tu peux donc instancier plusieurs fois
| avec les mêmes paramètres en donnant des noms différents; des choses comme
| les membres statiques ne sont pas partagées.

OK.

L'un des problèmes qui se posent pour C++, c'est que ce passe-t-il
avec

X<0> x, y;
f(x, y);

les deux instantiations donnent I=0 et J=0 -- donc, ont même type.
Si les deux déclarations se trouvent dans la même unité de traduction,
alors la résolution de surcharge dit qu'il y a ambiguité.

Donc, cela devient interessant lorsque les deux déclarations sont
séparées dans des unités de traduction distinctes *et* qu'on fait de la
compilation séparée, par exemple. Dans ce cas la règle vuet qu'on ne
confondent pas les deux.
Concrêtement, cela impose de mangler les noms des specializations
en gardant l'information qui les relies aux templates dont ils
proviennent. Ce qui donne des situations assez intéressantes avec
sizeof: le mangleur doit pouvoir mangler n'importe quelle operande valide.
Beaucoup de compilateurs actuels ont oublié ce petit détails.

En fait, on n'a pas besoin de la compilation séparée pour tomber sur
le problème. Il suffit de prendre les adresses des functions

// tu-1.C
X<0> (*p)(X<0>, X<0>) = &f;

// tu-2.C
X<0> (*p)(X<0>, X<0>) = &f;

// tu-3.C
assert (p != q);

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

[...]

| > Je ne connais pas très bien Ada, mais l'un des problèmes avec les
| > paramètres non-types, c'est la conjonction de déduction d'arguments
| > template et la réduction de leurs valeurs. (Ce qui a été la source
| > d'une discussion fameuse entre BS et Dave MacQueen).
| >
| > Considère
| >
| > template<int N> struct X { };
| >
| > template<int I, int J> X<I+J> f(X<I>, X<J>);
| > template<int I, int J> X<I-J> f(X<I>, X<J>);
| >
| > La question est comment distinguer ces deux functions, en particulier
| > lorsqu'elles ont des types qui coincident (imagine les deux fonctions
| > sont dans des unités de traduction différentes). Selon ce que j'ai
| > compris, BS proposait le modèle actuel, mais d'autres soutenaient que
| > 2+3 ne devrait pas être la même chose que 5.
|
| Je me demande quel modèle ils avaient.

Ben "2+3" et "5" ne designent pas la même valeur -- ce qui veut dire
qu'on ne peut pas faire des joujoux avec des « meta-programes » :-)

| > Est-ce que Ada a des
| > problèmes similaires ? Si oui, comment est-ce que c'est résolu ?
|
| Le problème ne se pose pas: toutes les "spécialisations" sont explicites et
| nommées. L'effet est un peu comme si en C++ tu n'avais qu'un paramètre
| template et que tu emploies systématiquement des traits, que tu ais besoin
| de plusieurs paramètres ou pas. Tu peux donc instancier plusieurs fois
| avec les mêmes paramètres en donnant des noms différents; des choses comme
| les membres statiques ne sont pas partagées.

OK.

L'un des problèmes qui se posent pour C++, c'est que ce passe-t-il
avec

X<0> x, y;
f(x, y);

les deux instantiations donnent I=0 et J=0 -- donc, ont même type.
Si les deux déclarations se trouvent dans la même unité de traduction,
alors la résolution de surcharge dit qu'il y a ambiguité.


Je dois être un peu bouché, quelles que que soit les paramètres il me
semble qu'il y a ambiguité. Mais j'ai compris le problème que ça peut
poser avec quelque chose du genre

template<int I, int J> void f(X<I>, X<J>, X<I+J>);
template<int I, int J> void f(X<I>, X<J>, X<I-J>);

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Gabriel Dos Reis
Jean-Marc Bourguet writes:


[...]

| Je dois être un peu bouché, quelles que que soit les paramètres il me
| semble qu'il y a ambiguité. Mais j'ai compris le problème que ça peut
| poser avec quelque chose du genre
|
| template<int I, int J> void f(X<I>, X<J>, X<I+J>);
| template<int I, int J> void f(X<I>, X<J>, X<I-J>);

oui c'est cela.

-- Gaby
Avatar
Marc Boyer
Le 28-09-2006, Alain Gaillard a écrit :

Non sommes bien d'accord sur ce point.


Lire: Nous somme bien d'accord sur ce point


Illustration de "tout correctif d'un bug ajoute un bug".

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)


Avatar
Alain Gaillard



Non sommes bien d'accord sur ce point.


Lire: Nous somme bien d'accord sur ce point



Illustration de "tout correctif d'un bug ajoute un bug".

Marc Boyer


LOL

--
Alain



4 5 6 7 8