tableau statique : forcer l'allocation ? [Résolu] - C++ - Programmation
Marsh Posté le 14-10-2012 à 18:06:44
Chez moi ça marche, sur une vieille bécane sous XP avec peu de mémoire
Code :
|
C:\Documents and Settings\c>gcc -o tab.exe tab.c |
A+,
Marsh Posté le 15-10-2012 à 11:05:08
Tu parles de std::vector ?
Code :
|
Chez moi, ça marche (d'ailleurs je crois qu'un tel tableau ne prend que 40MB dans la mémoire, ou alors je me plante dans mes calculs mais rien de bien monstre)
Marsh Posté le 15-10-2012 à 21:36:59
Bonsoir !
40 Mo n'est pas une quantité de mémoire énorme, certes, mais uniquement si l'allocation est faite sur le tas (auquel cas il est possible d'allouer toute la mémoire du système en 64 bits et 2 ou 3 Go selon l'OS et le paramétrage en 32 bits).
En revanche, une allocation statique ( int tableau[10000000]; ) se fait sur la pile et, là, la taille disponible est bien moindre : Sous Linux, la taille par défaut est souvent de 10 Mo, et sous Windows, souvent de 1Mo pour des programmes compilés avec Visual (cf. http://msdn.microsoft.com/fr-fr/li [...] s58a6.aspx).
D'où la nécessité de faire une allocation dynamique, ou d'utiliser une classe qui masque l'allocation dynamique, comme le std::vector.
Marsh Posté le 15-10-2012 à 22:01:48
Bonsoir!
Merci à vous trois pour vos réponses !
...Malheureusement, je suis un peu obligé de faire une allocation statique, type tableau[10000000]...puisque c'est une règle du tp
(je la trouve d'ailleurs assez tadada mais elle est ainsi et je dois composer avec).
Sachant ceci, est ce que je peux utiliser la fonction malloc donnée dans l'exemple de Gilou ?
Ou y a t-il un autre moyen de passer outre cette limite de 10Mo sans passer par les vecteurs ?
Encore une fois, merci d'avance pour vos réponses.
Marsh Posté le 15-10-2012 à 23:06:15
Je ne partage pas votre avis sur la nécessité d'allouer statiquement le tableau, ce qui ne correspond pas vraiment à une bonne pratique : Imaginez que cette allocation se fasse dans une fonction récursive, chaque niveau d'appel alloue 40 Mo et il faut avoir une pile énorme pour pouvoir lancer le programme ... Pour moi, faire une allocation dynamique (ou allouer un std::vector de la taille voulue, ce qui revient en fait au même) est LA bonne façon de faire. Et devoir augmenter la taille de la pile pour ça est, selon moi, l'indication d'une mauvaise implémentation.
Mais ce n'est que mon avis !
Marsh Posté le 16-10-2012 à 00:00:03
NotUsedPseudo a écrit : Bonsoir! |
Les vecteurs, c'est tout aussi dynamique que malloc.
Si vous voulez du vrai statique, c'est toujours possible, en mettant les bonnes options à la compilation pour que la stack ait la taille nécessaire, et ça, ça dépend totalement de votre compilateur et de l'OS. Sous Windows, avec Visual C++, c'est l'option de compilation /F nnn
Mais ça n'a pas grand intérêt, l'allocation dynamique est bien plus pratique à mettre en oeuvre.
Vous n'avez pas le droit d'écrire
int * table = new int[10000000];
pour votre tp?
Parce qu'il m'aurait semblé logique qu'on attende de vous quelque chose de ce genre:
Code :
|
ou sa variante sans exception
Code :
|
qui la encore marche très bien sur une bécane poussive et avec peu de mémoire:
C:\clang>g++ -o table.exe table.cpp |
A+,
Marsh Posté le 17-10-2012 à 20:56:22
Bonsoir à tous !
J'ai effectivement mal compris le sujet
En faisant int * table = new int[10000000] comme suggéré,
je n'ai plus d'erreur d'allocation.
Encore merci pour votre aide
Marsh Posté le 14-10-2012 à 14:57:33
Bonjour !
Je suis débutant en C++ et je rencontre un problème sur un TP un peu particulier.
Il s'agit de déclarer et manipuler deux tableaux (int et char) qui seront testés sur 10 millions d'entrées.
Or, j'ai l'impression que le système refuse d'allouer plus de 1 millions d'entrées.
Existe t-il un moyen de forcer l'allocation ?
Je précise que je n'ai le droit qu'à la std, et que l'implémentation
d'une liste dynamique (même faite par soit même) est fortement découragée...
Merci d'avance pour vos réponses
Message édité par NotUsedPseudo le 17-10-2012 à 20:57:06