Enfin, si tu fais du C++, la différence fondamentale entre la pile et le
tas n'est pas une question de vitesse d'allocation mais de sémantique de
durée de vie des objets : un objet sur la pile est détruit uand il sort
du "scope", pas sur le tas.
Enfin, si tu fais du C++, la différence fondamentale entre la pile et le
tas n'est pas une question de vitesse d'allocation mais de sémantique de
durée de vie des objets : un objet sur la pile est détruit uand il sort
du "scope", pas sur le tas.
Enfin, si tu fais du C++, la différence fondamentale entre la pile et le
tas n'est pas une question de vitesse d'allocation mais de sémantique de
durée de vie des objets : un objet sur la pile est détruit uand il sort
du "scope", pas sur le tas.
Vincent Burel wrote:
>>
>> celle de VC, celle de Borland ou autre... Tu penses à laquelle en
>> particulier?
>
> générallement le malloc utilise un HeapAlloc ou un GlobalAlloc...
> Après il est évident qu'un programmeur sait quand est-ce qu'il faut
> utiliser ces fonctions ou pas :-)
Les CRT rajoutent leur propre mécanisme de cache/allocation par blocs par
dessus HeapAlloc, donc les problématiques de fragmentation/espace contigu
disponible/vitesse des allocations sontt complêtement différentes quand on
utilise une CRT.
> Si la taille des élément reste petite (de 1 octet à quelque kilo) on
> peut faire des gestion particulière sur un tas qui augment par pas de
> 500 kilo ou 5 Mega et qui autorise une défragmentation en mode
> Idle... mais ca c'est un truc de programmeur évidemment :-)
Tu penses à un garbage collector ou à autre chose?
>>> Et c'est sans parler des techniques d'optimisation (buffer pool :
>>> allouer de la mémoire par avance et réutiliser les buffers...)
>> Bien sûr, c'est juste beaucoup de boulot en plus.
>
> ben, une fois que c'est fait, c'est fait,
Non : il faut le faire à chaque programme.
> et étant donné que ca fait
> partie des premieres choses qu'on développe quand on commence
> l'informatique : tableau dynamique, gestion de collection d'objet,
> gestion mémoire, gestion de fichier, database, tri , dichotomie...
> bon je vais pas vous faire le programme de première année de BTS...
> mais bon, si ta pas ces outils dans ta musette , change de métier.
Tu es toujours aussi désagréable à chaque fois que tu réponds, oh grand
gourou de l'informatique?
>>> Tu es limité par la taille de la mémoire virtuelle avant celle de
>>> l'es- pace d'adressage. Je rappelle que les processus sous windows
>>> s'exécutent tous dans un segment virtuel de 4Go. En gros si le tas
>>> peut pas faire 4Go, la pile le pourra pas plus.
>
> 1 Go pour le mapping DLL et un autre pour le mapping system... il
> reste même pas 1Go pour le code je crois
Tu crois mal : Il y a 2GO pour *toutes* les données du mode user : code,
tas, piles, TLS, données statiques, etc...
> ,et la pile (par thread )
> est par défaut de l'ordre de qqc Mega...
Comme l'OP la dit, c'est (généralement) un paramètre du compilateur. C'est
en tout cas un champ dans l'en-tête des fichiers PE (SizeOfStackReserve et
StackOfSizeCommit dans IMAGE_OPTIONAL_HEADER). La valeur par défaut est
Vincent Burel wrote:
>>
>> celle de VC, celle de Borland ou autre... Tu penses à laquelle en
>> particulier?
>
> générallement le malloc utilise un HeapAlloc ou un GlobalAlloc...
> Après il est évident qu'un programmeur sait quand est-ce qu'il faut
> utiliser ces fonctions ou pas :-)
Les CRT rajoutent leur propre mécanisme de cache/allocation par blocs par
dessus HeapAlloc, donc les problématiques de fragmentation/espace contigu
disponible/vitesse des allocations sontt complêtement différentes quand on
utilise une CRT.
> Si la taille des élément reste petite (de 1 octet à quelque kilo) on
> peut faire des gestion particulière sur un tas qui augment par pas de
> 500 kilo ou 5 Mega et qui autorise une défragmentation en mode
> Idle... mais ca c'est un truc de programmeur évidemment :-)
Tu penses à un garbage collector ou à autre chose?
>>> Et c'est sans parler des techniques d'optimisation (buffer pool :
>>> allouer de la mémoire par avance et réutiliser les buffers...)
>> Bien sûr, c'est juste beaucoup de boulot en plus.
>
> ben, une fois que c'est fait, c'est fait,
Non : il faut le faire à chaque programme.
> et étant donné que ca fait
> partie des premieres choses qu'on développe quand on commence
> l'informatique : tableau dynamique, gestion de collection d'objet,
> gestion mémoire, gestion de fichier, database, tri , dichotomie...
> bon je vais pas vous faire le programme de première année de BTS...
> mais bon, si ta pas ces outils dans ta musette , change de métier.
Tu es toujours aussi désagréable à chaque fois que tu réponds, oh grand
gourou de l'informatique?
>>> Tu es limité par la taille de la mémoire virtuelle avant celle de
>>> l'es- pace d'adressage. Je rappelle que les processus sous windows
>>> s'exécutent tous dans un segment virtuel de 4Go. En gros si le tas
>>> peut pas faire 4Go, la pile le pourra pas plus.
>
> 1 Go pour le mapping DLL et un autre pour le mapping system... il
> reste même pas 1Go pour le code je crois
Tu crois mal : Il y a 2GO pour *toutes* les données du mode user : code,
tas, piles, TLS, données statiques, etc...
> ,et la pile (par thread )
> est par défaut de l'ordre de qqc Mega...
Comme l'OP la dit, c'est (généralement) un paramètre du compilateur. C'est
en tout cas un champ dans l'en-tête des fichiers PE (SizeOfStackReserve et
StackOfSizeCommit dans IMAGE_OPTIONAL_HEADER). La valeur par défaut est
Vincent Burel wrote:
>>
>> celle de VC, celle de Borland ou autre... Tu penses à laquelle en
>> particulier?
>
> générallement le malloc utilise un HeapAlloc ou un GlobalAlloc...
> Après il est évident qu'un programmeur sait quand est-ce qu'il faut
> utiliser ces fonctions ou pas :-)
Les CRT rajoutent leur propre mécanisme de cache/allocation par blocs par
dessus HeapAlloc, donc les problématiques de fragmentation/espace contigu
disponible/vitesse des allocations sontt complêtement différentes quand on
utilise une CRT.
> Si la taille des élément reste petite (de 1 octet à quelque kilo) on
> peut faire des gestion particulière sur un tas qui augment par pas de
> 500 kilo ou 5 Mega et qui autorise une défragmentation en mode
> Idle... mais ca c'est un truc de programmeur évidemment :-)
Tu penses à un garbage collector ou à autre chose?
>>> Et c'est sans parler des techniques d'optimisation (buffer pool :
>>> allouer de la mémoire par avance et réutiliser les buffers...)
>> Bien sûr, c'est juste beaucoup de boulot en plus.
>
> ben, une fois que c'est fait, c'est fait,
Non : il faut le faire à chaque programme.
> et étant donné que ca fait
> partie des premieres choses qu'on développe quand on commence
> l'informatique : tableau dynamique, gestion de collection d'objet,
> gestion mémoire, gestion de fichier, database, tri , dichotomie...
> bon je vais pas vous faire le programme de première année de BTS...
> mais bon, si ta pas ces outils dans ta musette , change de métier.
Tu es toujours aussi désagréable à chaque fois que tu réponds, oh grand
gourou de l'informatique?
>>> Tu es limité par la taille de la mémoire virtuelle avant celle de
>>> l'es- pace d'adressage. Je rappelle que les processus sous windows
>>> s'exécutent tous dans un segment virtuel de 4Go. En gros si le tas
>>> peut pas faire 4Go, la pile le pourra pas plus.
>
> 1 Go pour le mapping DLL et un autre pour le mapping system... il
> reste même pas 1Go pour le code je crois
Tu crois mal : Il y a 2GO pour *toutes* les données du mode user : code,
tas, piles, TLS, données statiques, etc...
> ,et la pile (par thread )
> est par défaut de l'ordre de qqc Mega...
Comme l'OP la dit, c'est (généralement) un paramètre du compilateur. C'est
en tout cas un champ dans l'en-tête des fichiers PE (SizeOfStackReserve et
StackOfSizeCommit dans IMAGE_OPTIONAL_HEADER). La valeur par défaut est
On 2004-04-19, Arnaud Debaene wrote:
>> Le gros problème sous Windows c'est les implémentations foireuses
>> de malloc() &co., du genre :
> Ce n'est pas Windows qui implémente malloc : c'est la CRT que tu utilises :
Où vois-tu que j'ai dit le contraire ?
> celle de VC, celle de Borland ou autre... Tu penses à laquelle en
> particulier?
Oui : celles de Borland et de lcc-win32. Pour VC je n'ai pas testé.
>> * pour allouer un bloc il faut généralement traverser tous ceux
>> du tas avant de trouver un espace libre, ce qui est cata-
>> strophique au niveau performance.
> Tu connais des implémentations d'allocateur généraliste (pas de taille fixe,
> etc...) qui font autrement sans obtenir rapidement une fragmentation
> catastrophique?
Oui : celle de la lib C que j'ai sous FreeBSD par exemple.
http://www.freebsd.org/cgi/man.cgi?query=malloc&apropos=0&sektion=0&manpath=FreeBSD+5.2-RELEASE+and+Ports&format=html
Je rajoute une remarque : en parcourant toute la liste chaînée des
blocs on tue tous les effets bénéfiques de la pagination.
Après on s'étonne qu'un appel à malloc soit gourmand et on cherche
à bidouiller une autre solution qui généralement rend les programmes
moins stables.
Dire "c'est normal que ça plante tu as appelé free() avec un mauvais
paramètre, c'est écrit dans la doc il n'y a rien à changer" quand on
sait le nombre de bogues que cela engendre moi j'appelle ça de la
mauvaise foi.
>> Rien qu'en changeant de routine malloc() &co. on y gagne.
> Et en la remplacant par?
Une autre implémentation de malloc(), il en existe même certaines
capables de faire du gc.
Ou alors en dernier recours, ta propre
implémentation.
Je ne vais pas citer ESR, cela a déjà été fait dans ce fil, mais
il ne faut pas se lancer tête baissée dans des optimisations
aléatoires.
On 2004-04-19, Arnaud Debaene <adebaene@club-internet.fr> wrote:
>> Le gros problème sous Windows c'est les implémentations foireuses
>> de malloc() &co., du genre :
> Ce n'est pas Windows qui implémente malloc : c'est la CRT que tu utilises :
Où vois-tu que j'ai dit le contraire ?
> celle de VC, celle de Borland ou autre... Tu penses à laquelle en
> particulier?
Oui : celles de Borland et de lcc-win32. Pour VC je n'ai pas testé.
>> * pour allouer un bloc il faut généralement traverser tous ceux
>> du tas avant de trouver un espace libre, ce qui est cata-
>> strophique au niveau performance.
> Tu connais des implémentations d'allocateur généraliste (pas de taille fixe,
> etc...) qui font autrement sans obtenir rapidement une fragmentation
> catastrophique?
Oui : celle de la lib C que j'ai sous FreeBSD par exemple.
http://www.freebsd.org/cgi/man.cgi?query=malloc&apropos=0&sektion=0&manpath=FreeBSD+5.2-RELEASE+and+Ports&format=html
Je rajoute une remarque : en parcourant toute la liste chaînée des
blocs on tue tous les effets bénéfiques de la pagination.
Après on s'étonne qu'un appel à malloc soit gourmand et on cherche
à bidouiller une autre solution qui généralement rend les programmes
moins stables.
Dire "c'est normal que ça plante tu as appelé free() avec un mauvais
paramètre, c'est écrit dans la doc il n'y a rien à changer" quand on
sait le nombre de bogues que cela engendre moi j'appelle ça de la
mauvaise foi.
>> Rien qu'en changeant de routine malloc() &co. on y gagne.
> Et en la remplacant par?
Une autre implémentation de malloc(), il en existe même certaines
capables de faire du gc.
Ou alors en dernier recours, ta propre
implémentation.
Je ne vais pas citer ESR, cela a déjà été fait dans ce fil, mais
il ne faut pas se lancer tête baissée dans des optimisations
aléatoires.
On 2004-04-19, Arnaud Debaene wrote:
>> Le gros problème sous Windows c'est les implémentations foireuses
>> de malloc() &co., du genre :
> Ce n'est pas Windows qui implémente malloc : c'est la CRT que tu utilises :
Où vois-tu que j'ai dit le contraire ?
> celle de VC, celle de Borland ou autre... Tu penses à laquelle en
> particulier?
Oui : celles de Borland et de lcc-win32. Pour VC je n'ai pas testé.
>> * pour allouer un bloc il faut généralement traverser tous ceux
>> du tas avant de trouver un espace libre, ce qui est cata-
>> strophique au niveau performance.
> Tu connais des implémentations d'allocateur généraliste (pas de taille fixe,
> etc...) qui font autrement sans obtenir rapidement une fragmentation
> catastrophique?
Oui : celle de la lib C que j'ai sous FreeBSD par exemple.
http://www.freebsd.org/cgi/man.cgi?query=malloc&apropos=0&sektion=0&manpath=FreeBSD+5.2-RELEASE+and+Ports&format=html
Je rajoute une remarque : en parcourant toute la liste chaînée des
blocs on tue tous les effets bénéfiques de la pagination.
Après on s'étonne qu'un appel à malloc soit gourmand et on cherche
à bidouiller une autre solution qui généralement rend les programmes
moins stables.
Dire "c'est normal que ça plante tu as appelé free() avec un mauvais
paramètre, c'est écrit dans la doc il n'y a rien à changer" quand on
sait le nombre de bogues que cela engendre moi j'appelle ça de la
mauvaise foi.
>> Rien qu'en changeant de routine malloc() &co. on y gagne.
> Et en la remplacant par?
Une autre implémentation de malloc(), il en existe même certaines
capables de faire du gc.
Ou alors en dernier recours, ta propre
implémentation.
Je ne vais pas citer ESR, cela a déjà été fait dans ce fil, mais
il ne faut pas se lancer tête baissée dans des optimisations
aléatoires.
Arnaud Debaene wrote:
> Tu crois mal : Il y a 2GO pour *toutes* les données du mode user :
> code, tas, piles, TLS, données statiques, etc...
Toi aussi tu crois mal, cela dépend de ton OS et de quelques réglages :o).
Par exemple, via le célèbre /3GB, tu peux avoir 3GO d'espace d'adressage.
Arnaud Debaene wrote:
> Tu crois mal : Il y a 2GO pour *toutes* les données du mode user :
> code, tas, piles, TLS, données statiques, etc...
Toi aussi tu crois mal, cela dépend de ton OS et de quelques réglages :o).
Par exemple, via le célèbre /3GB, tu peux avoir 3GO d'espace d'adressage.
Arnaud Debaene wrote:
> Tu crois mal : Il y a 2GO pour *toutes* les données du mode user :
> code, tas, piles, TLS, données statiques, etc...
Toi aussi tu crois mal, cela dépend de ton OS et de quelques réglages :o).
Par exemple, via le célèbre /3GB, tu peux avoir 3GO d'espace d'adressage.
> ben, une fois que c'est fait, c'est fait, et étant donné que ca fait
> des premieres choses qu'on développe quand on commence l'informatique :
> tableau dynamique, gestion de collection d'objet, gestion mémoire,
> de fichier, database, tri , dichotomie... bon je vais pas vous faire le
> programme de première année de BTS... mais bon, si ta pas ces outils
> musette , change de métier.
Beaucoup de programmeurs "hobbyistes" n'ont malheureusement pas ça
dans leur musette et quand ils les ont (par ex ils ont pris la peine
de lire des bouts de la STL) ils les utilisent n'importe comment.
> Maintenant alloué de la mémoire dans la pile, à part pour quelque kilo
> variables locales... ca ne se pratique pas des masses...
J'ai un avis mitigé sur la question.
C'est vrai qu'une allocation sur la pile est plus rapide que sur le
tas, alors pour les variables locales, même si elles sont grandes,
ça vaut le coup.
> ben, une fois que c'est fait, c'est fait, et étant donné que ca fait
> des premieres choses qu'on développe quand on commence l'informatique :
> tableau dynamique, gestion de collection d'objet, gestion mémoire,
> de fichier, database, tri , dichotomie... bon je vais pas vous faire le
> programme de première année de BTS... mais bon, si ta pas ces outils
> musette , change de métier.
Beaucoup de programmeurs "hobbyistes" n'ont malheureusement pas ça
dans leur musette et quand ils les ont (par ex ils ont pris la peine
de lire des bouts de la STL) ils les utilisent n'importe comment.
> Maintenant alloué de la mémoire dans la pile, à part pour quelque kilo
> variables locales... ca ne se pratique pas des masses...
J'ai un avis mitigé sur la question.
C'est vrai qu'une allocation sur la pile est plus rapide que sur le
tas, alors pour les variables locales, même si elles sont grandes,
ça vaut le coup.
> ben, une fois que c'est fait, c'est fait, et étant donné que ca fait
> des premieres choses qu'on développe quand on commence l'informatique :
> tableau dynamique, gestion de collection d'objet, gestion mémoire,
> de fichier, database, tri , dichotomie... bon je vais pas vous faire le
> programme de première année de BTS... mais bon, si ta pas ces outils
> musette , change de métier.
Beaucoup de programmeurs "hobbyistes" n'ont malheureusement pas ça
dans leur musette et quand ils les ont (par ex ils ont pris la peine
de lire des bouts de la STL) ils les utilisent n'importe comment.
> Maintenant alloué de la mémoire dans la pile, à part pour quelque kilo
> variables locales... ca ne se pratique pas des masses...
J'ai un avis mitigé sur la question.
C'est vrai qu'une allocation sur la pile est plus rapide que sur le
tas, alors pour les variables locales, même si elles sont grandes,
ça vaut le coup.
Intéressant, mais ils ne disent pas grand chose :
Si je comprend bien, ca veut dire que la CRT ne maintient pas de "free
blocks list" et que c'est le kernel qui fait lui-même ce travail.
- à chaque appel de malloc, il y a un passage en mode noyau. Je ne
sais pas pour FreeBSD, mais généralement un passage en mode noyau
c'est assez lourd.
Générallement, les algos sont d'ailleurs nettement plus compliqué pour
minimoser la fragmentation. Tu as des détails sur la méthode utilisée
par le memory manager de FreeBSD?
Ceci-dit, quand on utilise malloc/free si on a l'idiome RAII à sa
disposition, c'est qu'on tend le baton pour se faire battre ;-) (ce
n'est pas *toujours* vrai, mais quand même pour la majorité des
allocations faites générallement dans un programme C).
Une autre implémentation de malloc(), il en existe même certaines
capables de faire du gc.
Oui, mais tu changes complètement la logique de ton programme dans ce
cas là.
Intéressant, mais ils ne disent pas grand chose :
Si je comprend bien, ca veut dire que la CRT ne maintient pas de "free
blocks list" et que c'est le kernel qui fait lui-même ce travail.
- à chaque appel de malloc, il y a un passage en mode noyau. Je ne
sais pas pour FreeBSD, mais généralement un passage en mode noyau
c'est assez lourd.
Générallement, les algos sont d'ailleurs nettement plus compliqué pour
minimoser la fragmentation. Tu as des détails sur la méthode utilisée
par le memory manager de FreeBSD?
Ceci-dit, quand on utilise malloc/free si on a l'idiome RAII à sa
disposition, c'est qu'on tend le baton pour se faire battre ;-) (ce
n'est pas *toujours* vrai, mais quand même pour la majorité des
allocations faites générallement dans un programme C).
Une autre implémentation de malloc(), il en existe même certaines
capables de faire du gc.
Oui, mais tu changes complètement la logique de ton programme dans ce
cas là.
Intéressant, mais ils ne disent pas grand chose :
Si je comprend bien, ca veut dire que la CRT ne maintient pas de "free
blocks list" et que c'est le kernel qui fait lui-même ce travail.
- à chaque appel de malloc, il y a un passage en mode noyau. Je ne
sais pas pour FreeBSD, mais généralement un passage en mode noyau
c'est assez lourd.
Générallement, les algos sont d'ailleurs nettement plus compliqué pour
minimoser la fragmentation. Tu as des détails sur la méthode utilisée
par le memory manager de FreeBSD?
Ceci-dit, quand on utilise malloc/free si on a l'idiome RAII à sa
disposition, c'est qu'on tend le baton pour se faire battre ;-) (ce
n'est pas *toujours* vrai, mais quand même pour la majorité des
allocations faites générallement dans un programme C).
Une autre implémentation de malloc(), il en existe même certaines
capables de faire du gc.
Oui, mais tu changes complètement la logique de ton programme dans ce
cas là.
On 2004-04-20, Arnaud Debaene wrote:Intéressant, mais ils ne disent pas grand chose :
Tu peux regarder le code source si tu as 5min à perdre :
Je ne vais pas défendre cette implémentation (il y a par exemple
une horreur ligne 696-698) mais elle est moins foireuse que celles
que j'ai utilisé auparavent.
J'ai entré "free malloc c implementation" dans goole et je suis tombé
sur pas mal de pages intéressantes, dont celle de Doug Lea.Si je comprend bien, ca veut dire que la CRT ne maintient pas de
"free
blocks list" et que c'est le kernel qui fait lui-même ce travail.
Si, cette info est contenue dans les listes chaînées pginfo et pgfree.
La différence est que ces métadonnées sont contenues dans des pages
contigues et non éparpillées un peu partout dans la mémoire.
On 2004-04-20, Arnaud Debaene <adebaene@club-internet.fr> wrote:
Intéressant, mais ils ne disent pas grand chose :
Tu peux regarder le code source si tu as 5min à perdre :
Je ne vais pas défendre cette implémentation (il y a par exemple
une horreur ligne 696-698) mais elle est moins foireuse que celles
que j'ai utilisé auparavent.
J'ai entré "free malloc c implementation" dans goole et je suis tombé
sur pas mal de pages intéressantes, dont celle de Doug Lea.
Si je comprend bien, ca veut dire que la CRT ne maintient pas de
"free
blocks list" et que c'est le kernel qui fait lui-même ce travail.
Si, cette info est contenue dans les listes chaînées pginfo et pgfree.
La différence est que ces métadonnées sont contenues dans des pages
contigues et non éparpillées un peu partout dans la mémoire.
On 2004-04-20, Arnaud Debaene wrote:Intéressant, mais ils ne disent pas grand chose :
Tu peux regarder le code source si tu as 5min à perdre :
Je ne vais pas défendre cette implémentation (il y a par exemple
une horreur ligne 696-698) mais elle est moins foireuse que celles
que j'ai utilisé auparavent.
J'ai entré "free malloc c implementation" dans goole et je suis tombé
sur pas mal de pages intéressantes, dont celle de Doug Lea.Si je comprend bien, ca veut dire que la CRT ne maintient pas de
"free
blocks list" et que c'est le kernel qui fait lui-même ce travail.
Si, cette info est contenue dans les listes chaînées pginfo et pgfree.
La différence est que ces métadonnées sont contenues dans des pages
contigues et non éparpillées un peu partout dans la mémoire.