OVH Cloud OVH Cloud

Contigüité des éléments d'un `std::vector´

167 réponses
Avatar
drkm
Je viens de tomber sur un message de Michel, d'il y a un mois, dont
voici un extrait :

> From: "Michel Michaud" <mm@gdzid.com>
> Subject: Re: buffer et std::vector<char> passage de l'un a l'autre
> Message-ID: <pQnHa.816$5d.225371@news20.bellglobal.com>
> Date: Mon, 16 Jun 2003 14:16:52 -0400

> Avec

> vector<char> v(taille);

> &v[0] est un char* qui peut être passé aux fonctions attendant un
> char[]/char*. La norme ne dit pas explicitement que les char sont
> contigus, mais c'est un fait et il y a une correction à la norme qui
> l'indique aussi.

J'avais toujours entendu dire que la contigüités des éléments d'un
vecteur était garantie. Apparemment non. Pour ce qui est de la
correction à la norme, je suppose que tu parlais d'un DR. En as-tu la
référence, stp ?

--drkm

10 réponses

Avatar
Alain Naigeon
"Arnaud Meurgues" a écrit dans le message
news:
Alain Naigeon wrote:

Une première tentative de programmation objet ?


Pourquoi alors être parti du C (with classes) ? Il y a smalltalk pour
ça, non ?

administration. Si on me déconseille vivement l'usage d'une tournure,
d'un type, etc, j'ai envie que le langage m'interdise, à terme, de les
utiliser - et ceci d'autant plus que les auteurs de l'interdiction ont
plus


de bon sens ;-)


Et l'on se rapproche du Pascal qui interdit ce qui est jugé mauvais par
le concepteur du langage.


Si seulement on s'en rapprochait ! Pascal est mort, Modula 2 n'a jamais
vraiment pris, et semble mort aussi, et malheureusement il ne semble pas
y avoir d'équivalent moderne à ces langages.
Je m'étais mis à C par pur réalisme, mais je ne l'ai jamais aimé. Evidemment
j'ai préféré C++, et de loin, mais il charrie encore pas mal de choses
anciennes,
et sur certains points il a même du retard sur le vieux Pascal qui fut tenu
à
bout de bras par Borland (ce Pascal avait des modules, C++ n'arrête pas
de dire depuis des années qu'il en aura un jour..; Pascal avait un type
intervalle,
discriminé sur son nom et non pas sur sa définition, ce qui est précieux
dans pas
mal de cas, etc...)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| "Arnaud Debaene" a écrit dans le message news:
|
| > "Alain Naigeon" wrote in message
| news:<3f145a08$0$26591$...
| > > "Arnaud Debaene" a écrit dans le message
| news:
| > >
| > >
| > > > "Alain Naigeon" wrote in message
| > > news:<3f107896$0$10882$...
| > > >
| > > > De mon point de vue, la compatibilité de std::vector avec des
| > > > interfaces "C" du type read (Posix) est une justification suffisante.
| > >
| > > Cela dépend du prix à payer...
| > ??? Quel "prix"? En quoi cette obligation de continuité de pénalise
| > t'elle dans ton abstraction si tu n'en tiens pas compte?
|
| Concernant le point abordé, on s'est mal compris ; mon passage
| en question regrettait la persistance de tournures de "bas niveau",
| héritées de C, permettant de faire tout et n'importe quoi.

telles que ?

| L'argument consistant à dire qu'il suffit de ne pas s'en servir ne me
| va pas du tout, il permet de justifier aussi l'usage de données
| publiques, tant qu'on y est, puisqu'il suffit de ne pas les modifier à
| mauvais escient...

Je ne crois pas que ce soit de le rôle de C++ de forcer les gens à
aller dans Une Seule Direction. S'il n'y a rien à protéger, je ne vois
pas pourquoi la donnée membre devrait être no-publique. I.e. pourquoi
std::<> ne devrait pas avoir ses données membres publiques ?

Comme dirait Steve Clamage, C++ te protège de Murphy, pas de Machiavel.

-- Gaby
Avatar
Arnaud Meurgues
Alain Naigeon wrote:

Et l'on se rapproche du Pascal qui interdit ce qui est jugé mauvais par
le concepteur du langage.
Si seulement on s'en rapprochait !



C'est une question de goût. Un prof de fac expliquait que ce n'était pas
pour rien que Pascal avait été inventé par un suisse, de tradition
calviniste. Il faut interdire ce qui est Mal (par exemple, modifier
l'indice d'une boucle for dans le corps de la boucle).
Le C vient d'une culture beaucoup plus pragmatique.

Pascal est mort, Modula 2 n'a jamais
vraiment pris, et semble mort aussi, et malheureusement il ne semble pas
y avoir d'équivalent moderne à ces langages.


Je ne connais pas Modula-2. Mais Ada n'a-t-il pas nombre des qualités
que tu attends d'un langage ?

Arnaud


Avatar
Arnaud Meurgues
Gabriel Dos Reis wrote:

| > Une première tentative de programmation objet ?
| Pourquoi alors être parti du C (with classes) ? Il y a smalltalk pour
| ça, non ?
Toi, tu as besoin de lire « the Designa nd Evolution of C++ ».


Je l'ai lu il y a longtemps. Qu'ais-je dit de faux ?

Arnaud

Avatar
Gabriel Dos Reis
Arnaud Meurgues writes:

| calviniste. Il faut interdire ce qui est Mal (par exemple, modifier
| l'indice d'une boucle for dans le corps de la boucle).

Que dire d'Ada?

| Le C vient d'une culture beaucoup plus pragmatique.

Bof.

-- Gaby
Avatar
Arnaud Meurgues
Gabriel Dos Reis wrote:

Comme dirait Steve Clamage, C++ te protège de Murphy, pas de Machiavel.


:-D J'aime beaucoup.

Mais j'ai un doute sur le réalisme de cette déclaration. Dans le cas
cité par Jean-Marc, par exemple, sur les passage de paramètres avec des
auto_ptr, j'y vois du machiavelisme de C++ et non une protection contre
Murphy...

À moins que Clamage ait voulu distinguer le langage syntaxique de la
bibliothèque ?

Arnaud

Avatar
Gabriel Dos Reis
Arnaud Meurgues writes:

| Gabriel Dos Reis wrote:
|
| > | > Une première tentative de programmation objet ?
| > | Pourquoi alors être parti du C (with classes) ? Il y a smalltalk pour
| > | ça, non ?
| > Toi, tu as besoin de lire « the Designa nd Evolution of C++ ».
|
| Je l'ai lu il y a longtemps. Qu'ais-je dit de faux ?

Quelqu'un a dit que tu as dit quelque chose de faux ?

-- Gaby
Avatar
Arnaud Meurgues
Alain Naigeon wrote:

Si Monsieur Machin *fait* plus d'erreur, alors ce n'est pas de
la diffamation, juste une indélicatesse non condamnable
en droit.


Dans ce cas là, oui, car la personne ayant commis l'« indélicatesse »
peut trouver des preuves de ce qu'elle avance.
Mais quand ces preuves ne peuvent être produites (quand elles concernent
la sphère privée, par exemple), qu'en est-il ?

Arnaud

Avatar
Arnaud Meurgues
Gabriel Dos Reis wrote:

| Mais il semble que pour toi, le *fait* qu'il n'y ait pas *mention
| explicite* de cette intention avant la norme prime sur le fait que des
| gens aient pu y penser et savoir le vouloir.
Mais cela ne fait pas automatiquement on a « inventé qu'on a oublié ».


Non. Effectivement. En fait, même, si l'on pousse jusqu'au bout ce que
j'ai cru comprendre de la façon de voir de James (i.e. ne s'attacher
qu'au fait ou au comportement observable), alors on ne peut rien
conclure sur le fait qu'ils aient ou pas eu une intention, l'intention
non exprimée n'étant pas observable.

Je ne crois pas que ce soit une question de pragmatique
vs. non-pragmatique oui anglo-saxon vs. français.


Bon. C'est possible.
De plus, je soupçonne que ta culture à toi soit encore différente de la
culture française (même s'il y a des influences) dont je parlais.

Stroustrup lit régulièrement (Sans répondre directement) ce groupe. Je
ne sais pas s'il répondra.


On verra. Mais il ne serait pas étonnant qu'il juge cela sans intérêt.

Arnaud

Avatar
Christophe Lephay
a écrit dans le message de
news:
Arnaud Meurgues wrote in message
Selon James, personne n'a pensé explicitement, avant l'adoption
définitive de la norme, que la mémoire d'un std::vector devait être
contigüe et pas autrement.


Plus exactement, que personne n'a pensé explicitement que la contiguïté
fasse partie de l'interface contractuelle. Les implémentations d'avant
la norme était bien contiguë.
...

Et moi, je ne vois pas ce qu'il y a de diffamant à dire qu'on n'y avait
pas pensé. C'est tout. On ne pense jamais à tout.


Soit on considère que la nature contigue de vector relève du détail
d'implémentation, ce que peut laisser penser le fait que ce ne soit pas
spécifié par la norme, soit c'est une spécification importante.

Dans le premier cas, le fait de revoir son point de vue après avoir constaté
une exigence de compatibilité avec le C, en faisant un impératif de la
contiguité, me parait loin d'être honteux, au contraire même, dans la mesure
où c'est faire preuve à la fois d'humilité et de pragmatisme.

Dans le deuxième cas, quand on voit avec quel soin (pointillisme ?) chaque
mot est discuté pendant de nombreuses heures par le comité (à ce qu'il
semble), on voit mal comment celà aurait pu passer à travers et être oublié.

Je trouve le premier cas plus crédible, même si le second ne me choque pas
vraiment, dans la mesure où celà ne change pas grand chose d'un point de vue
concret. Je pense même que c'est si peu important que les membres du comité
de l'époque seraient difficilement capables de se souvenir de leur position
ferme à l'époque. En fait, il est peu courant d'avoir une position ferme
tant qu'on ne l'a pas exprimée et, inversement, s'il était question d'une
position ferme, je vois mal comment elle n'aurait pas été exprimée.

Chris