Allocation dynamique... [pour les connaisseurs] - C++ - Programmation
Marsh Posté le 04-02-2003 à 18:29:27
ben regarde le man et souvient toi que la pile est bien plus petite sue le tas
Marsh Posté le 04-02-2003 à 18:31:15
ça dépend la taille de ta pile ! tu risques un débordement de pile si tu alloues une valeur trop grande.
par contre, évite d'utiliser alloca() comme argument à une fonction ! étant donné qu'alloca() alloue de la mémoire sur la pile, et que tu empiles les arguments, tu risques de te retrouver avec un beau bordel...
question : pourquoi alloca() ?
edit: j'oubliais ! une fois que tu sors de ta fonction, tu perds l'espace alloué...
Marsh Posté le 04-02-2003 à 18:31:30
J'ai jeté un coup d'oeil, il n'y pas grand chose à pars effectivement le fait que alloca utilise la pile.
Bien plus petite, ce qui annonce un risque de débordement mémoire si l'appliquation est conséquente?
Marsh Posté le 04-02-2003 à 18:32:20
Harkonnen a écrit : ça dépend la taille de ta pile ! tu risques un débordement de pile si tu alloues une valeur trop grande. |
Eh bien visiblement alloca est nettement plus rapide en terme d'execution que malloc...
Marsh Posté le 04-02-2003 à 18:33:57
Fodger a écrit : |
franchement, le gain de vitesse justifie t'il tous les inconvénients sus-cités ?
Marsh Posté le 04-02-2003 à 18:35:40
non. de toutes façons la pile n'est pas faite pour les allocations dynamiques, point final.
Marsh Posté le 04-02-2003 à 18:40:37
Et bien j'applique des calculs très très lourds (genre ça peut prendre plus d'une heure), alors je cherche à optimiser, seulement j'ai du mal à trouver des sites explicites...
Marsh Posté le 04-02-2003 à 18:43:21
Fodger a écrit : Et bien j'applique des calculs très très lourds (genre ça peut prendre plus d'une heure), alors je cherche à optimiser, seulement j'ai du mal à trouver des sites explicites... |
avant de chercher à optimiser de cette façon, je pense d'abord qu'il faut optimiser l'algo... sans doute gagneras tu quelques millisecondes, mais tu seras obligé de faire quantité de tests pour éviter tout débordement, et au final, tu perdras de la vitesse d'éxécution...
et comme dit Taz, la pile n'est pas faite pour ça !
Marsh Posté le 04-02-2003 à 18:47:53
Oui je suis bien d'accord, mais l'optimisation de l'algo dans mon cas reste limité... alors du coup je cherche à m'attaquer directement aux instructions, aux affections...
J'ai fait en sorte aussi d'utiliser au maximum les multiplications plutôt que les divisions, des petits trucs comme ça.
Marsh Posté le 04-02-2003 à 18:52:09
montres un peu... y a surement un moyen de réduire tes allocations dynamiques
Marsh Posté le 04-02-2003 à 19:05:33
Bein ne le prends pas mal, mais je ne peux pas:D, 'cause secret pro:sweat:...
Marsh Posté le 04-02-2003 à 20:51:19
qu'est-ce que tu pourrais précalculer ?
qu'est-ce que tu pourrais retirer des boucles les plus imbriquées et remettre dans les boucles supérieures ?
tes allocations sont elles si consommatrices ? (as-tu essayé de bencher/profiler le temps passé en alloc )
peux-tu passer par un pool intelligent :
du style si tu as un tableau dynamique au lieu de realloc a chaque élement faire un realloc par pavé de 100 éléments quand c'est nécessaire, as-tu droit à la stl, dont vector<> pour commençer ?
tes structures de données sont-elles correctement alignés vis à vis du cache du cpu ? (y'a-t-il moyen de réorganiser les structures pour maximzer l'éfficacité du cache)
est-tu dépendant d'accès disque ?
etc... etc...
C'est quoi que tu fait ?
L'algo ?
Marsh Posté le 04-02-2003 à 21:00:18
ici on parle de C, donc tout ce qui est STL ou vector, ça n'existe pas
Marsh Posté le 04-02-2003 à 21:05:47
++Taz a écrit : ici on parle de C, donc tout ce qui est STL ou vector, ça n'existe pas |
y en a encore (sisi) qui utilise malloc, printf, etc. en C++
Marsh Posté le 05-02-2003 à 06:44:27
alloca n'est pas standard, donc pas portable.
La mémoire n'est pas libérée à la fin du bloc, mais à celle de la fonction.
Donc, si on l'utilises dans une boucle le cumul peut vite saturer:
Code :
|
Marsh Posté le 04-02-2003 à 18:09:41
Y'a t'il un risque à utiliser la fonction alloca() plutôt que malloc siou plé?
thx