histoire de pile ..... [C] - C++ - Programmation
Marsh Posté le 08-04-2002 à 22:49:53
programmes le en Caml,
ou alors verifies que tu ne peux pas derecursifier
ton programme (c'est souvent le cas)!
Evites d'allouer un trop grand nombre de variables
sur la pile, si une variable
n'est valide qu'entre deux appels a la fonction
recursive deplace la en global.
A+
LEGREG
Marsh Posté le 09-04-2002 à 01:18:56
legreg a écrit a écrit : programmes le en Caml, ou alors verifies que tu ne peux pas derecursifier ton programme (c'est souvent le cas)! Evites d'allouer un trop grand nombre de variables sur la pile, si une variable n'est valide qu'entre deux appels a la fonction recursive deplace la en global. A+ LEGREG |
a part econnomiser de la pile ...
on ne peux pas savoir ou on en est dedans ??? de maniere a depiler au dernier moment ? ...
comment savoir a quel adresse le pile commence en memoire ???
et ou est la tete de pile en memoire ??
car si je sait cela je peux en deduire le taille qui me reste a coup de sbrk();
sachant que l'espace mem qui me reste vaudrat
(tete de pile) - sbrk();
et quand ca est trop pres de 0 je depile et basta
Marsh Posté le 09-04-2002 à 01:32:09
sbrk? ca n'existe que sous Unix (Linux), non ?
pour connaitre la taille prise par la pile
c'est simple: tu peux le prevoir en connaissant
par avance la profondeur des appels recursif que tu fais
(d'ou l'importance de savoir ce que tu alloues sur la pile!)
de plus, le bas de la pile c'est lorsque tu es au niveau
zero de tes appels recursifs, pas tres complique a concevoir.
A+
LEGREG
Marsh Posté le 09-04-2002 à 01:48:03
legreg a écrit a écrit : sbrk? ca n'existe que sous Unix (Linux), non ? pour connaitre la taille prise par la pile c'est simple: tu peux le prevoir en connaissant par avance la profondeur des appels recursif que tu fais (d'ou l'importance de savoir ce que tu alloues sur la pile!) de plus, le bas de la pile c'est lorsque tu es au niveau zero de tes appels recursifs, pas tres complique a concevoir. A+ LEGREG |
sbrk est une fonction linux qui te permet de savoir a quel adresse est le haut de ta pille de malloc (cette pile de malloc vas a l'encontre de la pile en memoire) ccl lespace entre le haut de la pille et ladresse que te renvoie sbrk est de la place libre pour soit des mallocs soit du mangage de pile
la pile elle se trouve juste avant le kernel
en gros
vla ta memoire sous linux
[[zone de texte][zone de data][malloc->>>> . <<<-pile][kernel]]
sbrk() me donne cette adresse |
si je sait ou demmare ma pile je serait a moitie sauvé koike la pile est aussi limite
mais bon ta la raison la pourquoi quand tu malloc tu perd de la pile .........
Marsh Posté le 09-04-2002 à 09:24:34
je connais sbrk, je te faisais juste remarquer
que ca ne marchera que quand tu es sous Linux..
Pour l'endroit ou demarre la pile, tu as la reponse dans mon post precedent a quelques chouai d'octets pres.
Citation : quand tu malloc tu perd de la pile ......... |
Mouai, ca ne tient pas a moins que tu comptes
utiliser plus de 4 Go de memoire conjuguee pile + tas
et tu auras plus probablement deja fait plante ta machine
bcoz manque de memoire physique + swap..
A noter que sous certains systemes (Solaris + threads)
la pile a une limite intrinseque mais ca ne change rien a ton probleme.
Tu ne penses pas que ce serait plus simple de revoir ton algo et la facon dont tu alloues tes objets :??
LEGREG
Marsh Posté le 09-04-2002 à 09:38:06
legreg a écrit a écrit : A noter que sous certains systemes (Solaris + threads) la pile a une limite intrinseque mais ca ne change rien a ton probleme. |
Il y a un truc que je ne comprends pas, là.
Si la pile n'a pas de limite intrinsèque, et qu'il n'alloue pas 4 Go avec malloc de façon à rejoindre la pile dans l'espace d'allocation, comment se fait-il qu'il soit impossible d'empiler autant d'appels récursifs qu'on veut ?
Marsh Posté le 09-04-2002 à 10:22:39
legreg a écrit a écrit : a mon avis, le probleme c'est le code |
Oui, ça me paraît plus plausible...
Marsh Posté le 09-04-2002 à 10:48:19
Jar Jar a écrit a écrit : Il y a un truc que je ne comprends pas, là. Si la pile n'a pas de limite intrinsèque, et qu'il n'alloue pas 4 Go avec malloc de façon à rejoindre la pile dans l'espace d'allocation, comment se fait-il qu'il soit impossible d'empiler autant d'appels récursifs qu'on veut ? |
sur du linux la pile ne vaut ke 32Mo envrion
vais revoir mon code je pourrais gagner quel que cases suplemaentaires ... mais ne ferrais que repousser le problemen un peut plus loin
sinon jessayerrais de faire ca en iteratif ....
Marsh Posté le 09-04-2002 à 11:01:28
Je me trompe peut etre, mais est ce que la taille de la pile n'est pas modifiable avec ulimit?
Marsh Posté le 09-04-2002 à 11:44:23
daique a écrit a écrit : Je me trompe peut etre, mais est ce que la taille de la pile n'est pas modifiable avec ulimit? |
Gagné.
Code :
|
Marsh Posté le 09-04-2002 à 12:46:26
Jar Jar a écrit a écrit : Gagné.
|
vais essayer je vious tiens au courant
Marsh Posté le 08-04-2002 à 21:25:59
jai proge un generateur demonde ...
le truc est recursif font et ca fonctionne le hic c'est quand je veux generer des mondes trop grands au dela de 900x900
ca pete des segfault (normal vut ke c'est du recursif)
donc je cherche un moyen de verifier letat de la pile en temps reel
de maniere a en liberer quand c'est a la limite du segfault .... et ainsi pouvoir generre des mondes encore plus grands ))
truc rigolo : ce prog sous window limitais les mond a 200x200 apres cette limite segfault je compile le meme code sous linux et la je peux generrer du 900x900 ))))) aprs segfault