tableau statique : forcer l'allocation ? [Résolu]

tableau statique : forcer l'allocation ? [Résolu] - C++ - Programmation

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  :jap:


Message édité par NotUsedPseudo le 17-10-2012 à 20:57:06
Reply

Marsh Posté le 14-10-2012 à 14:57:33   

Reply

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 :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.     int *table = malloc(10000000 * sizeof(int));
  5.     if (!table) {
  6.         printf("Erreur à l'allocation\n" );
  7.     }
  8.     else {
  9.         printf("Allocation OK\n" );
  10.         free(table);
  11.     }
  12.     return 0;
  13. }


C:\Documents and Settings\c>gcc -o tab.exe tab.c
C:\Documents and Settings\c>tab
Allocation OK


A+,


Message édité par gilou le 14-10-2012 à 18:07:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-10-2012 à 11:05:08    

Tu parles de std::vector ?

  
Code :
  1. #include<iostream>
  2. #include<vector>
  3. int main()
  4. {
  5.     std::vector<int> i;
  6.     i.resize(10000000);
  7.     std::cout<<"Size : "<<i.size()<<'\n';
  8.     return 0;
  9. }
 

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)


Message édité par Terminapor le 15-10-2012 à 11:05:33

---------------
Perhaps you don't deserve to breathe
Reply

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.


Message édité par Farian le 15-10-2012 à 21:40:57
Reply

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.

Reply

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 !

Reply

Marsh Posté le 16-10-2012 à 00:00:03    

NotUsedPseudo a écrit :

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.

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 :
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4. int main(int argc, char *argv[]) {
  5.     int *table;
  6.     try {
  7.         table = new int[10000000];
  8.     } catch (bad_alloc xa) {
  9.         cout << "Echec allocation" << endl;
  10.         return 1;
  11.     }
  12.     cout << "Allocation OK" << endl;
  13.     delete [] table;
  14.     cout << "Desallocation" << endl;
  15.     return 0;
  16. }


ou sa variante sans exception

Code :
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4. int main(int argc, char *argv[]) {
  5.     int *table = new (nothrow) int[10000000];
  6.     if (table == 0) {
  7.         cout << "Echec allocation" << endl;
  8.         return 1;
  9.     }
  10.     cout << "Allocation OK" << endl;
  11.     delete [] table;
  12.     cout << "Desallocation" << endl;
  13.     return 0;
  14. }


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
 
C:\clang>table
Allocation OK
Desallocation


 
A+,


Message édité par gilou le 16-10-2012 à 00:28:01

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-10-2012 à 20:56:22    

Bonsoir à tous !
J'ai effectivement mal compris le sujet  :D  
En faisant int * table = new int[10000000] comme suggéré,  
je n'ai plus d'erreur d'allocation.  
Encore merci pour votre aide  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed