> Donc quand je demande si « table[i] existe en mémoire », je suis
> trop succinct, car ça peut vouloir dire :
> 1) est-ce que la valeur de table[i] est une adresse qui existe
> ou
> 2) est-ce que l'objet table[i] est stocké en mémoire
Voilà. Moi, je ne vois que la seconde forme ; la première ne me vient
pas à l'esprit. Entre autres parce qu'une expression qui a pour type
int[N] n'est pas pour moi un pointeur ou une adresse, mais un objet.
>> Par ailleurs, le pointeur est lui-même un objet, et comme tout objet
>> possède son adresse propre.
>
> C'est bien de ça que je parlais.
¿¿¿Bzzz??? Là tu m'as complètement perdu...
l'hypothétique adresse où se trouve l'hypothétique pointeur (qui pour
moi n'existe pas, je l'appelerai virtuel).
Euh... Je dois avoir loupé quelque chose...
Pour moi, un tableau dynamique ne désigne pas un tableau de pointeurs
vers des tableaux (éventuellement disjoints en mémoire, et de taille
allouées éventuellement distinctes), mais plutôt un tableau homogène
d'un seul bloc alloué dynamiquement (par malloc()).
Par ailleurs, dans la formulation
int table[3][4];
il n'y a que 12 int, et pas de tableaux de pointeurs;
> table[i] == &(table[i][0])
> Non ?
Mais pour moi, les deux sont des objets (tableaux de 4 int) ; qui en
plus d'une adresse ont un type, et dont la valeur sont des quadruplets.
Évidemment, avec ces conventions, tu ne dois pas comprendre la plupart
de mes remarques car je n'arrive pas à entrer dans ton formalisme.
Je m'en excuse.
Non, le compilateur ne réserve pas de zones mémoire pour ces pointeurs,
ils restent virtuels.
(OK, dans les détails, il est possible que dans certaines expressions
complexes le compilateur soit obligé de créer des variables temporaires,
normalement en pile, pour stocker ces pointeurs lors du calcul d'une
expression plus large. Donc il y aura réservation d'espace "auto".
Impossible de répondre à cette question en général.
Un autre exemple où l'allocation par morceau peut être moins efficace :
si l'allocateur mémoire fabrique des morceaux juste d'une taille
multiple d'une page, et si tu traverses la matrice dans l'autre sens : à
un instant donné tu vas donc manipuler des lignes mémoire qui ont toutes
par le même motif d'adresse xx234yy0 (par exemple), et tu peux (pouvais)
alors engorger une petite partie du TLB...
La manière habituelle d'optimiser ce genre de contrainte est d'allouer
une taille d'éléments légèrement supérieure qui ne soit pas multiple de
la taille de page, mais là cela ne va pas fonctionner à cause de
l'allocateur.
> ~> xycc
> bash: xycc: command not found
Pardon.
>>> Tous les types du C existent-ils ?
les informations de type sont (normalement) rangées dans le fichier
objet produit sous forme d'informations symboliques destinées à
l'éventuel débogage.
En fait, je voulais savoir si tu voulais faire référence à l'ensemble de
tous les types possible du langage C,
ou bien si tu voulais faire référence à l'ensemble des types que le
compilateur a construit au cours de l'analyse
ou si tu faisais référence aux types explicitement utilisés,
> Donc quand je demande si « table[i] existe en mémoire », je suis
> trop succinct, car ça peut vouloir dire :
> 1) est-ce que la valeur de table[i] est une adresse qui existe
> ou
> 2) est-ce que l'objet table[i] est stocké en mémoire
Voilà. Moi, je ne vois que la seconde forme ; la première ne me vient
pas à l'esprit. Entre autres parce qu'une expression qui a pour type
int[N] n'est pas pour moi un pointeur ou une adresse, mais un objet.
>> Par ailleurs, le pointeur est lui-même un objet, et comme tout objet
>> possède son adresse propre.
>
> C'est bien de ça que je parlais.
¿¿¿Bzzz??? Là tu m'as complètement perdu...
l'hypothétique adresse où se trouve l'hypothétique pointeur (qui pour
moi n'existe pas, je l'appelerai virtuel).
Euh... Je dois avoir loupé quelque chose...
Pour moi, un tableau dynamique ne désigne pas un tableau de pointeurs
vers des tableaux (éventuellement disjoints en mémoire, et de taille
allouées éventuellement distinctes), mais plutôt un tableau homogène
d'un seul bloc alloué dynamiquement (par malloc()).
Par ailleurs, dans la formulation
int table[3][4];
il n'y a que 12 int, et pas de tableaux de pointeurs;
> table[i] == &(table[i][0])
> Non ?
Mais pour moi, les deux sont des objets (tableaux de 4 int) ; qui en
plus d'une adresse ont un type, et dont la valeur sont des quadruplets.
Évidemment, avec ces conventions, tu ne dois pas comprendre la plupart
de mes remarques car je n'arrive pas à entrer dans ton formalisme.
Je m'en excuse.
Non, le compilateur ne réserve pas de zones mémoire pour ces pointeurs,
ils restent virtuels.
(OK, dans les détails, il est possible que dans certaines expressions
complexes le compilateur soit obligé de créer des variables temporaires,
normalement en pile, pour stocker ces pointeurs lors du calcul d'une
expression plus large. Donc il y aura réservation d'espace "auto".
Impossible de répondre à cette question en général.
Un autre exemple où l'allocation par morceau peut être moins efficace :
si l'allocateur mémoire fabrique des morceaux juste d'une taille
multiple d'une page, et si tu traverses la matrice dans l'autre sens : à
un instant donné tu vas donc manipuler des lignes mémoire qui ont toutes
par le même motif d'adresse xx234yy0 (par exemple), et tu peux (pouvais)
alors engorger une petite partie du TLB...
La manière habituelle d'optimiser ce genre de contrainte est d'allouer
une taille d'éléments légèrement supérieure qui ne soit pas multiple de
la taille de page, mais là cela ne va pas fonctionner à cause de
l'allocateur.
> ~> xycc
> bash: xycc: command not found
Pardon.
>>> Tous les types du C existent-ils ?
les informations de type sont (normalement) rangées dans le fichier
objet produit sous forme d'informations symboliques destinées à
l'éventuel débogage.
En fait, je voulais savoir si tu voulais faire référence à l'ensemble de
tous les types possible du langage C,
ou bien si tu voulais faire référence à l'ensemble des types que le
compilateur a construit au cours de l'analyse
ou si tu faisais référence aux types explicitement utilisés,
> Donc quand je demande si « table[i] existe en mémoire », je suis
> trop succinct, car ça peut vouloir dire :
> 1) est-ce que la valeur de table[i] est une adresse qui existe
> ou
> 2) est-ce que l'objet table[i] est stocké en mémoire
Voilà. Moi, je ne vois que la seconde forme ; la première ne me vient
pas à l'esprit. Entre autres parce qu'une expression qui a pour type
int[N] n'est pas pour moi un pointeur ou une adresse, mais un objet.
>> Par ailleurs, le pointeur est lui-même un objet, et comme tout objet
>> possède son adresse propre.
>
> C'est bien de ça que je parlais.
¿¿¿Bzzz??? Là tu m'as complètement perdu...
l'hypothétique adresse où se trouve l'hypothétique pointeur (qui pour
moi n'existe pas, je l'appelerai virtuel).
Euh... Je dois avoir loupé quelque chose...
Pour moi, un tableau dynamique ne désigne pas un tableau de pointeurs
vers des tableaux (éventuellement disjoints en mémoire, et de taille
allouées éventuellement distinctes), mais plutôt un tableau homogène
d'un seul bloc alloué dynamiquement (par malloc()).
Par ailleurs, dans la formulation
int table[3][4];
il n'y a que 12 int, et pas de tableaux de pointeurs;
> table[i] == &(table[i][0])
> Non ?
Mais pour moi, les deux sont des objets (tableaux de 4 int) ; qui en
plus d'une adresse ont un type, et dont la valeur sont des quadruplets.
Évidemment, avec ces conventions, tu ne dois pas comprendre la plupart
de mes remarques car je n'arrive pas à entrer dans ton formalisme.
Je m'en excuse.
Non, le compilateur ne réserve pas de zones mémoire pour ces pointeurs,
ils restent virtuels.
(OK, dans les détails, il est possible que dans certaines expressions
complexes le compilateur soit obligé de créer des variables temporaires,
normalement en pile, pour stocker ces pointeurs lors du calcul d'une
expression plus large. Donc il y aura réservation d'espace "auto".
Impossible de répondre à cette question en général.
Un autre exemple où l'allocation par morceau peut être moins efficace :
si l'allocateur mémoire fabrique des morceaux juste d'une taille
multiple d'une page, et si tu traverses la matrice dans l'autre sens : à
un instant donné tu vas donc manipuler des lignes mémoire qui ont toutes
par le même motif d'adresse xx234yy0 (par exemple), et tu peux (pouvais)
alors engorger une petite partie du TLB...
La manière habituelle d'optimiser ce genre de contrainte est d'allouer
une taille d'éléments légèrement supérieure qui ne soit pas multiple de
la taille de page, mais là cela ne va pas fonctionner à cause de
l'allocateur.
> ~> xycc
> bash: xycc: command not found
Pardon.
>>> Tous les types du C existent-ils ?
les informations de type sont (normalement) rangées dans le fichier
objet produit sous forme d'informations symboliques destinées à
l'éventuel débogage.
En fait, je voulais savoir si tu voulais faire référence à l'ensemble de
tous les types possible du langage C,
ou bien si tu voulais faire référence à l'ensemble des types que le
compilateur a construit au cours de l'analyse
ou si tu faisais référence aux types explicitement utilisés,
> Jean-Claude Arbaut nous a appris qu'en C99 on pouvait faire
> double get(int n, int p, double t[n][p], int i, int j){return t[i][j];}
Et c'est un VLA (tableau à longueur variable) de VLA, et rien ne dit que
les perfs des VLAs sont les mêmes que celles des tableaux à taille fixe.
On doit probablement trouver des implémentations où les VLAs sont
implémentés comme des objets C++ avec méthodes virtuelles etc., et un
ordre de grandeur de performance différent.
> Jean-Claude Arbaut nous a appris qu'en C99 on pouvait faire
> double get(int n, int p, double t[n][p], int i, int j){return t[i][j];}
Et c'est un VLA (tableau à longueur variable) de VLA, et rien ne dit que
les perfs des VLAs sont les mêmes que celles des tableaux à taille fixe.
On doit probablement trouver des implémentations où les VLAs sont
implémentés comme des objets C++ avec méthodes virtuelles etc., et un
ordre de grandeur de performance différent.
> Jean-Claude Arbaut nous a appris qu'en C99 on pouvait faire
> double get(int n, int p, double t[n][p], int i, int j){return t[i][j];}
Et c'est un VLA (tableau à longueur variable) de VLA, et rien ne dit que
les perfs des VLAs sont les mêmes que celles des tableaux à taille fixe.
On doit probablement trouver des implémentations où les VLAs sont
implémentés comme des objets C++ avec méthodes virtuelles etc., et un
ordre de grandeur de performance différent.
C'était pour donner une image intuitive à Antoine.
C'était pour donner une image intuitive à Antoine.
C'était pour donner une image intuitive à Antoine.
Le 15 juin 2009, Antoine Leca a écrit :Jean-Claude Arbaut nous a appris qu'en C99 on pouvait faire
double get(int n, int p, double t[n][p], int i, int j){return t[i][j];}
Et c'est un VLA (tableau à longueur variable) de VLA, et rien ne dit que
les perfs des VLAs sont les mêmes que celles des tableaux à taille fixe.
On doit probablement trouver des implémentations où les VLAs sont
implémentés comme des objets C++ avec méthodes virtuelles etc., et un
ordre de grandeur de performance différent.
Peux-tu m'en dire plus ?
Tu fais peut-être référence à des objets tableaux
qui vérifient que l'index demandé ne sort pas des limites allouées ?
Le 15 juin 2009, Antoine Leca a écrit :
Jean-Claude Arbaut nous a appris qu'en C99 on pouvait faire
double get(int n, int p, double t[n][p], int i, int j){return t[i][j];}
Et c'est un VLA (tableau à longueur variable) de VLA, et rien ne dit que
les perfs des VLAs sont les mêmes que celles des tableaux à taille fixe.
On doit probablement trouver des implémentations où les VLAs sont
implémentés comme des objets C++ avec méthodes virtuelles etc., et un
ordre de grandeur de performance différent.
Peux-tu m'en dire plus ?
Tu fais peut-être référence à des objets tableaux
qui vérifient que l'index demandé ne sort pas des limites allouées ?
Le 15 juin 2009, Antoine Leca a écrit :Jean-Claude Arbaut nous a appris qu'en C99 on pouvait faire
double get(int n, int p, double t[n][p], int i, int j){return t[i][j];}
Et c'est un VLA (tableau à longueur variable) de VLA, et rien ne dit que
les perfs des VLAs sont les mêmes que celles des tableaux à taille fixe.
On doit probablement trouver des implémentations où les VLAs sont
implémentés comme des objets C++ avec méthodes virtuelles etc., et un
ordre de grandeur de performance différent.
Peux-tu m'en dire plus ?
Tu fais peut-être référence à des objets tableaux
qui vérifient que l'index demandé ne sort pas des limites allouées ?
dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
Tu fais peut-être référence à des objets tableaux
qui vérifient que l'index demandé ne sort pas des limites allouées ?
C'est théoriquement possible.
En fait, c'est probablement ce qui est implémenté dans un compilateur
qui saurait mixer C et Ada (où le langage requiert que le système
vérifie les indices par rapport aux limites à chaque utilisation).
Tu fais peut-être référence à des objets tableaux
qui vérifient que l'index demandé ne sort pas des limites allouées ?
C'est théoriquement possible.
En fait, c'est probablement ce qui est implémenté dans un compilateur
qui saurait mixer C et Ada (où le langage requiert que le système
vérifie les indices par rapport aux limites à chaque utilisation).
Tu fais peut-être référence à des objets tableaux
qui vérifient que l'index demandé ne sort pas des limites allouées ?
C'est théoriquement possible.
En fait, c'est probablement ce qui est implémenté dans un compilateur
qui saurait mixer C et Ada (où le langage requiert que le système
vérifie les indices par rapport aux limites à chaque utilisation).
In article
,
ld wrote:dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
Tiens, je n'avais pas fait gaffe, mais ce paragraphe est totalement
faux. La denombrabilite a tout a voir avec le nombre d'elements de
l'ensemble, ou plus exactement la possibilite d'etablir une bijection
entre l'ensemble et N (avec ou sans axiome du choix, pour les
puristes... et avec ou sans tiers exclu pour les fans de logique
intuitioniste).
Le fait d'avoir un successeur, c'est deja une structure algebrique, et
c'est une propriete totalement differente.
Je peux parfaitement te
fabriquer une structure sur R qui fait que tout element aura un
successeur
dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
In article
<9629865c-0e4d-474e-95c3-76942f98d2e5@s12g2000yqi.googlegroups.com>,
ld <Laurent.Deniau@gmail.com> wrote:
dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
Tiens, je n'avais pas fait gaffe, mais ce paragraphe est totalement
faux. La denombrabilite a tout a voir avec le nombre d'elements de
l'ensemble, ou plus exactement la possibilite d'etablir une bijection
entre l'ensemble et N (avec ou sans axiome du choix, pour les
puristes... et avec ou sans tiers exclu pour les fans de logique
intuitioniste).
Le fait d'avoir un successeur, c'est deja une structure algebrique, et
c'est une propriete totalement differente.
Je peux parfaitement te
fabriquer une structure sur R qui fait que tout element aura un
successeur
dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
In article
,
ld wrote:dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
Tiens, je n'avais pas fait gaffe, mais ce paragraphe est totalement
faux. La denombrabilite a tout a voir avec le nombre d'elements de
l'ensemble, ou plus exactement la possibilite d'etablir une bijection
entre l'ensemble et N (avec ou sans axiome du choix, pour les
puristes... et avec ou sans tiers exclu pour les fans de logique
intuitioniste).
Le fait d'avoir un successeur, c'est deja une structure algebrique, et
c'est une propriete totalement differente.
Je peux parfaitement te
fabriquer une structure sur R qui fait que tout element aura un
successeur
dénombrable veut dire qu'on peut les compter ou autrement dit, trouver
le successeur d'un élément. Ca n'a rien à voir avec le nombre
d'éléments de l'ensemble, mais avec la possibilité de les énumérer
(discret vs continu).
Le 16/06/2009 16:45, Jean-Marc Bourguet écrivit :En fait, c'est probablement ce qui est implémenté dans un compilateur
qui saurait mixer C et Ada (où le langage requiert que le système
vérifie les indices par rapport aux limites à chaque utilisation).
Pas nécessairement.
Pas nécessairement quoi ?
Le 16/06/2009 16:45, Jean-Marc Bourguet écrivit :
En fait, c'est probablement ce qui est implémenté dans un compilateur
qui saurait mixer C et Ada (où le langage requiert que le système
vérifie les indices par rapport aux limites à chaque utilisation).
Pas nécessairement.
Pas nécessairement quoi ?
Le 16/06/2009 16:45, Jean-Marc Bourguet écrivit :En fait, c'est probablement ce qui est implémenté dans un compilateur
qui saurait mixer C et Ada (où le langage requiert que le système
vérifie les indices par rapport aux limites à chaque utilisation).
Pas nécessairement.
Pas nécessairement quoi ?
Gcc a (eu?) quelque chose du genre, peut-être uniquement dans une branche.
Gcc a (eu?) quelque chose du genre, peut-être uniquement dans une branche.
Gcc a (eu?) quelque chose du genre, peut-être uniquement dans une branche.
Le fait d'avoir un successeur, c'est deja une structure algebrique, et c'est
N dote de son successeur habituel, et [0,1[ dote de la topologie triviale ou
tout point est isole).
Le fait d'avoir un successeur, c'est deja une structure algebrique, et c'est
N dote de son successeur habituel, et [0,1[ dote de la topologie triviale ou
tout point est isole).
Le fait d'avoir un successeur, c'est deja une structure algebrique, et c'est
N dote de son successeur habituel, et [0,1[ dote de la topologie triviale ou
tout point est isole).