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
adebaene
"Alain Naigeon" wrote in message news:<3f107896$0$10882$...

Question naïve : que faire de la notion d'adresse dans une
librairie un peu abstraite ? Je m'explique :

- d'une part, tu nous dis clairement qu'on peut compter
sur cette contiguïté ;
- d'autre part, il me semble que la seule façon de l'utiliser
serait en quelque sorte "malpropre", c'est à dire par des
calculs sur pointeurs avec des sizeof, etc - autrement dit
en "court-circuitant" l'interface de std::vector puisque,
sauf erreur de ma part (c'est ma question) cette propriété
de contiguïté n'est pas modélisée (représentée) dans cette
interface ?!

N'est -ce pas un peu choquant d'avoir une propriété dont
la garantie d'existence n'est pas représentée dans l'interface
de la classe - c'est une entorse à l'abstraction du type !?


De mon point de vue, la compatibilité de std::vector avec des
interfaces "C" du type read (Posix) est une justification suffisante.
Beaucoup de gens considèrent en effet qu'il s'agit d'une entorse à
l'abstraction de type et à la modélisation objet (y'a qu'à voir le
troll que cette question vient - une fois de plus - de déclencher). On
peut considérer cela comme une concession à la pratique existante et à
l'utilisabilité de vector, personnellement ce ne me choque pas du
tout.

D'un autre côté je me demande moi-même comment
représenter une telle propriété... après tout, cela concerne
en premier lieu *l'implémentation* d'un itérateur sur cette
classe, mais à partir du moment où l'utilisateur peut avoir
accès au "prochain" élément, en quoi cela l'intéresse-t-il
de savoir où il se trouve par rapport au précédent ?
Tout simplement parce qu'on peut vouloir accéder aux éléments du

vector autrement que par un itérateur. L'interface de vector propose
at et operator[].

Arnaud



Finalement j'arrive à formuler ma question sous sa forme la
plus intéressante : en quoi cette contiguïté est-elle pertinente
dans le contexte d'une classe munie d'un itérateur ? (dont
l'usager, je me répète, n'a pas à savoir *comment* il itère).


Avatar
Gabriel Dos Reis
(Arnaud Debaene) writes:

| > D'un autre côté je me demande moi-même comment
| > représenter une telle propriété... après tout, cela concerne
| > en premier lieu *l'implémentation* d'un itérateur sur cette
| > classe, mais à partir du moment où l'utilisateur peut avoir
| > accès au "prochain" élément, en quoi cela l'intéresse-t-il
| > de savoir où il se trouve par rapport au précédent ?
| Tout simplement parce qu'on peut vouloir accéder aux éléments du
| vector autrement que par un itérateur. L'interface de vector propose
| at et operator[].

Tout à fait exact. Et la question qui se posait était :

Si i et j sont des entiers dans les bornes d'un std::vector<> v,
l'égalité suivante a-t-elle lieu ?

&v[i] == &v[j] + (i - j) // ou &v.at(i) == &v.at(j) + (i - j)


-- Gaby
Avatar
Arnaud Meurgues
Gabriel Dos Reis wrote:

Et puis, de toute façon quelque source qu'on puisse citer, James
niera.


Puisque j'essaye de suivre le débat, puis-je exposer la compréhension
que j'en ai afin d'être certain de n'avoir rien raté ?

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. C'est en tout cas une façon d'interprêter ses
propos.
Si c'est bien ça qu'il veut dire, effectivement, c'est de la diffamation
ou, en tout cas, du procès d'intention (au sens propre). C'est je crois
ce qui est choquant dans les propos de James.

Mais j'ai l'impression qu'il y a une autre interprétation, peut-être
plus proche de ce qu'il veut dire, mais moins choquante. C'est de
comprendre que le comité, en tant que groupe d'humain, a eu l'intention
que la mémoire des std::vector soit contigüe. En ce cas, celà
signifierait que cette intention devait êtret connue et partagée de tous
les membres du comité, ce qui n'est évidemment pas vrai (James étant un
contre-exemple). Mais James semble tout de même dénier les intentions
explicites si celles-ci n'ont pas eu de manifestation publique (et il
est vrai que si personne d'exprime ses intentions, on ne peut prouver
qu'elles ont existé).

Selon Gabriel, si j'ai bien compris, des discussions entre plusieurs
personnes du comité ont explicitement abordé cette question, mais ces
propos sont confidentiels (est-ce bien cela les règles des réflecteurs).
Auquel cas, Gabriel au moins serait témoin de l'expression de ces
intentions, et des preuves sont disponibles qu'il ne peut cependant pas
exiber (les réflecteurs).

Peut-on conclure en disant que plusieurs membres du comité avaient
l'intention que la contiguïté soit obligatoire, mais que le comité dans
son ensemble (je suppose que tout le monde ne lit pas toutes les
discussions sur tous les sujets) n'avait pas spécifiquement cette
intention ?

Ou alors me suis-je trompé en cherchant à comprendre les propos de l'un
et de l'autre ?

Arnaud

Avatar
Gabriel Dos Reis
Arnaud Meurgues writes:

| Gabriel Dos Reis wrote:
|
| > Et puis, de toute façon quelque source qu'on puisse citer, James
| > niera.
|
| Puisque j'essaye de suivre le débat, puis-je exposer la compréhension
| que j'en ai afin d'être certain de n'avoir rien raté ?
|
| Selon James, personne n'a pensé explicitement, avant l'adoption

ça veut dire quoi « penser explicitement » ?

[...]

| Selon Gabriel, si j'ai bien compris, des discussions entre plusieurs

non, tu n'as rien compris.

| personnes du comité ont explicitement abordé cette question, mais ces
| propos sont confidentiels (est-ce bien cela les règles des
| réflecteurs). Auquel cas, Gabriel au moins serait témoin de
| l'expression de ces intentions, et des preuves sont disponibles qu'il
| ne peut cependant pas exiber (les réflecteurs).

ce que je dis, c'est que lorsque Andy Koenig (voir la date dans sur le
site du comité) a rapporté le problème officiellement (officiellement,
parce qu'avant il y a eu quelques divagations de la part de certains)
sur le réflecteur, des gens qui ont participé activement (dont Andy
Koenig lui-même, ainsi BS) à l'adoption de la STL dans la norme ont
exprimé que pour eux cela ne faisait aucun doute que std::vector
devait être contigu et que si cela n'apparait pas sur le papier, c'est
un oubli de leur part.

| Ou alors me suis-je trompé en cherchant à comprendre les propos de
| l'un et de l'autre ?

sur les miens, certainement.

-- Gaby
Avatar
Arnaud Meurgues
Gabriel Dos Reis wrote:

| Selon James, personne n'a pensé explicitement, avant l'adoption
ça veut dire quoi « penser explicitement » ?


Ça veut dire qu'on s'est posé la question en pensée et répondu, par exemple.

| Selon Gabriel, si j'ai bien compris, des discussions entre plusieurs
non, tu n'as rien compris.


Comme quoi j'ai bien fait de demander.

ce que je dis, c'est que lorsque Andy Koenig (voir la date dans sur le
site du comité) a rapporté le problème officiellement (officiellement,
parce qu'avant il y a eu quelques divagations de la part de certains)
sur le réflecteur, des gens qui ont participé activement (dont Andy
Koenig lui-même, ainsi BS) à l'adoption de la STL dans la norme ont
exprimé que pour eux cela ne faisait aucun doute que std::vector
devait être contigu et que si cela n'apparait pas sur le papier, c'est
un oubli de leur part.


Ok. Et en quoi cela contredit-il ce que dit James, alors ?

| Ou alors me suis-je trompé en cherchant à comprendre les propos de
| l'un et de l'autre ?
sur les miens, certainement.


Désolé.

Arnaud

Avatar
Gabriel Dos Reis
Arnaud Meurgues writes:

| Gabriel Dos Reis wrote:
|
| > | Selon James, personne n'a pensé explicitement, avant l'adoption
| > ça veut dire quoi « penser explicitement » ?
|
| Ça veut dire qu'on s'est posé la question en pensée et répondu, par exemple.

explicitement ?

| > | Selon Gabriel, si j'ai bien compris, des discussions entre plusieurs
| > non, tu n'as rien compris.
|
| Comme quoi j'ai bien fait de demander.
|
| > ce que je dis, c'est que lorsque Andy Koenig (voir la date dans sur le
| > site du comité) a rapporté le problème officiellement (officiellement,
| > parce qu'avant il y a eu quelques divagations de la part de certains)
| > sur le réflecteur, des gens qui ont participé activement (dont Andy
| > Koenig lui-même, ainsi BS) à l'adoption de la STL dans la norme ont
| > exprimé que pour eux cela ne faisait aucun doute que std::vector
| > devait être contigu et que si cela n'apparait pas sur le papier, c'est
| > un oubli de leur part.
|
| Ok. Et en quoi cela contredit-il ce que dit James, alors ?

relis le message où je disais que James faisait de la diffamation et
ce qui a suivi.

-- Gaby
Avatar
Alain Naigeon
"Arnaud Meurgues" a écrit dans le message
news: 3f1420b2$0$25195$
Si c'est bien ça qu'il veut dire, effectivement, c'est de la diffamation
ou, en tout cas, du procès d'intention (au sens propre).


Juste ceci : le procès d'intention peut se produire quand on entend
les propos de l'autre à la lumière de ses propres idées, sans pouvoir
s'en abstraire. C'est une faute intellectuelle (encourue par chacun
de nous). La diffamation c'est une intention de nuire, c'est très
différent !

--

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

Avatar
drkm
Gabriel Dos Reis writes:

Fabien LE LEZ writes:

| Euh... j'ai très nettement l'impression que tu es d'accord avec
| moi, mais que ton subconscient refuse de l'admettre ;-)

À ta place, je me retiendrais de m'aventurer sur ce terrain
hasardeux.


Quel terrain hasardeux ? Ton subconscient ?-)

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > Fabien LE LEZ writes:
|
| > | Euh... j'ai très nettement l'impression que tu es d'accord avec
| > | moi, mais que ton subconscient refuse de l'admettre ;-)
|
| > À ta place, je me retiendrais de m'aventurer sur ce terrain
| > hasardeux.
|
| Quel terrain hasardeux ?

celui que tu es en train d'emprunter.

-- Gaby
Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > Tous les cinq ans les status des normes ISO sont revisés. Dans le
| > cas de C++, le comité a suggéré -- et les pays membres ont voté oui
| > en majorité -- que C++ soit maintenu et que le TC1 soit incorporé à
| > C++98 pour donner C++2003.
|
| C++2003 existe déjà, alors ?

Oui.

| Moi qui pensais qu'une nouvelle norme allait sortir sous peu.

Comme quoi.

-- Gaby