bjr,
j'ai appris l'utiliter d'utiliser malloc pour stocker des donnees en dehors de la pile dans une fonction, mais est t il utile d utiliser malloc dans le main ?
si oui pourquoi ?
merci
bjr,
j'ai appris l'utiliter d'utiliser malloc pour stocker des donnees en dehors de la pile dans une fonction, mais est t il utile d utiliser malloc dans le main ?
si oui pourquoi ?
merci
Bonjour,
malloc permet aussi d'allouer beaucoup de mémoire, beaucoup plus que la pile ne le permet.
et le nombre de variable dans la pile est egale au nombre de registre ?
Non,
Ca peut dépendre du processeur (et du compilateur)
ok et vous connaissez le nombre de variable que je peux stocker dans la pile avec gcc
Déjà je ne sais pas si on peut parler de gcc dans ce cas, il me semble que ni le compilateur ni le langage ne rentre en jeu dans la détermination de la taille de la pile, c'est plus de l'ordre du Système d'exploitation mais, peut-être que je me trompe ?
Je suppose que tu voulais dire « taille de la pile » et non « nombre de variable » puisque ça n'a pas beaucoup de sens.
Pour déterminer la taille de la pile on peut faire comme suit (GNU/Linux uniquement) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/resource.h> int main( void ) { struct rlimit rlim; getrlimit(RLIMIT_STACK,&rlim); printf("%lu KiB\n",rlim.rlim_cur/1024); return 0; }Une autre façon portable, mais crados (provoquant volontairement un stack overflow) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
28192 KiB
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 #include <stdio.h> #include <stdlib.h> #define PRECISION (100) void foo(long unsigned bottom) { static unsigned calls=0; long unsigned top = (long unsigned)⊤ calls++; if(calls%PRECISION == 0) { printf("%lu KiB\n", (bottom - top)/1024); } foo(bottom); } int main( void ) { long unsigned sp = (unsigned long)&sp; foo(sp); /* 8184 */ return 0; }On se rapproche des 8192 KiB, il faut certainement rajouter la taille de l'enregistrement d'activation (est-ce le bon terme pour stack frame ? ) de printf etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
28184 KiB
Ceci dit on peut changer la taille de la pile via quelques appels système, sous GNU/Linux cela donne :
J'espère ne pas avoir dit trop de bêtises
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <sys/resource.h> #define PRECISION (100) void foo(long unsigned bottom) { static unsigned calls=0; long unsigned top = (long unsigned)⊤ calls++; if(calls%PRECISION == 0) { printf("%lu KiB\n", ((bottom - top)/1024)); } foo(bottom); } int main( void ) { long unsigned sp = (unsigned long)&sp; struct rlimit rlim; getrlimit(RLIMIT_STACK,&rlim); printf("Current Stack Size : %lu KiB\n",rlim.rlim_cur/1024); /* 8192 */ rlim.rlim_cur *=2; /* On DOUBLE la taille de la pile */ setrlimit(RLIMIT_STACK,&rlim); printf("Changed to : %lu KiB\n",rlim.rlim_cur/1024); /* 16384 */ /* Décommenter la ligne qui suit pour une vérification */ //foo(sp); /* 16373 KiB */ return 0; }![]()
Partager