IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Allocation dynamique au lancement d'un programme


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut Allocation dynamique au lancement d'un programme
    Salut salut,

    je viens (encore ) vous poser quelques questions sur l'allocation de la mémoire !

    Voici mon problème :

    j'ai un programme qui fais un calcul nécessitant de grands tableaux. Pour le moment je déclarais mes tableaux en statique, seulement je suis limité et je ne peux pas déclarer de tableaux au dessus d'une certaine taille.

    Je me suis donc mis à déclarer mes tableaux en dynamique. Le problème cette fois était que ma fonction de calcul était beaucoup plus longue du fait justement de l'allocation dynamique.

    Je me suis donc mis à vouloir déclarer mes tableaux de manière dynamique mais cette fois ci dans ma fenêtre principale (les tableaux étant des std::vector privé de ma classe "Fenêtre Principale").

    Je me disais qu'ainsi ma fonction de calcul serait plus rapide étant donné que l'allocation mémoire serait faites au lancement du programme. Mais en fait pas du tout !!!

    Je ne comprends pas tout à fait ce qu'il se passe et comme je suis encore débutant je me permet de vous demander vôtre avis sur ce que je fais !

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Que tu utilises simplement l'allocation dynamique ou un std::vector va, de toutes manières, présenter le même problème: l'augmentation de la taille va prendre énormément de temps car il s'agit d'allouer de la mémoire pour la nouvelle taille, de copier les différents éléments contenus dans ton tableau, pour enfin, libérer la mémoire de l'ancien tableau.

    L'idéal est donc d'essayer de réserver directement la taille pour l'ensemble des éléments que tu devras placer, s'il t'est possible de définir le nombre d'éléments que tu vas manipuler au total, du moins.

    Ceci dit, sans voir ton code, il nous sera très difficile de pouvoir t'aider en aucune manière, car les boulles de crystal on tendance à avoir des ratés en période de vacances
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Citation Envoyé par kipgon Voir le message
    Je me disais qu'ainsi ma fonction de calcul serait plus rapide étant donné que l'allocation mémoire serait faites au lancement du programme. Mais en fait pas du tout !!!
    Ba non, l'allocation dynamique se fait au moment ou le programme rentre dans la fonction qui la fait. De plus j'aurais tendance a penser que tu ne liberes pas la memoire d'apres ce que tu dis (pas bien !).

    Pour les variables statiques, elles sont "allouees" la premiere fois que le programme rentre dans la fonction puis liberer lorsque le programme se termine. Dans ton cas j'aurais tendance a penser que des variables statiques seraient plus interessantes mais t'as besoin de tableaux de tailles diverses c'est bien ca ? T'as pas une taille maximale ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    J'ai bien une taille maximale, mais si je déclare en statique mes tableaux de cette taille, mon programme plante quand je clique sur le bouton connecté à ma fonction de calcul !

    J'imagine que c'est une question d'espace mémoire mais je ne m'y connais pas vraiment .

    En tout cas on m'a dit que pour de grosse quantité de donnée il valait mieux prendre la mémoire sur le tas plutôt que sur la pile donc je suis passé en dynamique.

    De plus si j'ai entrepris de déclarer au lancement de mon programme mes tableaux plutôt que dans la fonction de calcul c'est parce qu'il me semble que les programmes tel que Matlab font de même, au lancement ils prennent un gros espace de la mémoire puis ils utilisent cette mémoire en fonction des besoins.

    Cela dit, j'ai du mal m'exprimer imperio, la déclaration dynamique ne se fait PAS dans ma fonction de calcul, elle se fait dans ma classe représentant ma fenêtre principale donc à l'ouverture du programme. C'est pour cela que je pose cette question de cout temporelle car je pensais qu'en déclarant mes tableaux avant ma fonction cela ferait que, l'allocation étant déjà effectué, le calcul soit aussi rapide qu'avec des tableaux statique.

    Mais bon j'ai fait un petit test pour des tableaux de 200 par 200 en ne réalisant qu'un calcul sur les 30 par 30 premières variables, il prend le même temps qu'avec une déclaration de tableau en 30 par 30 avec un calcul en 30 par 30. Aussi je me pose une question : est ce que le simple fait de modifier une "case" de tableau dynamique est plus long que de modifier une "case" de tableau statique ?

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Pourrais tu, comme tu ne sembles pas avoir compris l'allusion, au moins nous montrer ton code, parce que, comme cela, nous aurons vraiment énormément de mal à t'aider !

    Tu veux de l'aide , alors, aide nous à t'aider en nous montrant ce que tu as fait
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par kipgon Voir le message
    Mais bon j'ai fait un petit test pour des tableaux de 200 par 200 en ne réalisant qu'un calcul sur les 30 par 30 premières variables, il prend le même temps qu'avec une déclaration de tableau en 30 par 30 avec un calcul en 30 par 30. Aussi je me pose une question : est ce que le simple fait de modifier une "case" de tableau dynamique est plus long que de modifier une "case" de tableau statique ?
    L'accès est très certainement un peu plus long en moyenne du fait de la probabilité d'avoir un page fault.

    En dehors de ça c'est sensiblement identique.

    Il faut juste bien se rendre compte qu'un code type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::vector<int> vec;
    for(int i=0; i<1000000; ++i) {
        vec.push_back(i);
    }
    Sera BEAUCOUP plus long que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<int> vec;
    vec.reserve(1000001); // Je sais pas trop si le redimensionnement se fait quand size == capacity ou quand size dépasse capacity
    for(int i=0; i<1000000; ++i) {
        vec.push_back(i);
    }
    Tout simplement parce qu'a chaque push_back, il peut y avoir un redimensionnement du tableau (avec copie du contenu etc..) et ça, c'est long.

    Sinon, l'utilisation d'un tableau à 1 dimension au lieu de 2 amène, de manière générale, un temps d'exécution plus court.

  7. #7
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vec.reserve(1000001); // Je sais pas trop si le redimensionnement se fait quand size == capacity ou quand size dépasse capacity
    reserve fonctionne comme une allocation "normale";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vec.reserve(1000000);  ~= int vec[1000000];
    pas besoin d'allouer 1 de plus que nécessaire ici.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    Bonjour et excusez moi pour le retard,

    J'ai effectivement la possibilité de réduire le nombre de tableau, ce que je vais faire, mais j'aimerais comprendre pour l'allocation dynamique.

    Voici un pseudo code de ce que je fais :

    Tout d'abord j'ai créé un objet matrix dans le seul but de me simplifier la vie avec les vectors (linéariser le parcours du tableau etc ...)

    ici p est déclaré dans le .h comme ceci :

    pour le .cpp

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    matrix::matrix(int dim_i, int dim_j) : m_dim_i(dim_i), m_dim_j(dim_j)
    {
        p.resize(m_dim_i*m_dim_j);
     
        for (int i=0; i<m_dim_i; i++)
        {
            for (int j=0; j<m_dim_j; j++)
            {
                p[m_dim_j*i+j] = 0;
            }
        }
    }
     
    matrix::matrix(int dim_i) : m_dim_i(dim_i), m_dim_j(1)
    {
        p.resize(m_dim_i);
     
        for (int i=0; i<m_dim_i; i++)
        {
            p[i] = 0;
        }
    }
     
    matrix::matrix()
    {
     
    }
     
    matrix::~matrix()
    {
     
    }
     
    matrix &matrix::setSize(int dim_i, int dim_j)
    {
        this->~matrix();
     
        m_dim_i= dim_i;
        m_dim_j= dim_j;
     
        p.resize(m_dim_i*m_dim_j);
     
        for (int i=0; i<m_dim_i; i++)
        {
            for (int j=0; j<m_dim_j; j++)
            {
                p[m_dim_j*i+j] = 0;
            }
        }
     
        return *this;
    }
    Et voici comment je l'utilise :

    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
    #include "matrix.h"
     
    FenPrincipale::FenPrincipale()
    {
     
        int alloc = 200;
     
        m.setSize(alloc,alloc);
     
    QPushButton *boutonCalcul = new QPushButton("Calcul", this);
     
    connect(boutonCalcul, SIGNAL(clicked()),this, SLOT(Calcul()));
    }
     
    void FenPrincipale::Calcul()
    {
    //Utilisation de m
    }
    J'espère que je suis clair

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    peut-être qu'en prenant le problème dans un autre sens tu pourrais simplement te passer de tableaux et travailler avec moins de valeurs "en même temps".
    la nécessité de "grands tableaux" vient le plus souvent d'une incompréhension que d'une nécessité, à fortiori en débutant.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par kipgon Voir le message
    Salut salut,
    Je me suis donc mis à vouloir déclarer mes tableaux de manière dynamique mais cette fois ci dans ma fenêtre principale (les tableaux étant des std::vector privé de ma classe "Fenêtre Principale").
    Si tu utilise des std::vector et que tu es capable de déterminer la taille de ces dernier avant le calcul, tu peux utiliser la fonction reserve() pour préparer la place mémoire nécéssaire.

    Cela peut avoir un impact ou pas, tout dépend de la façon dont tu utilise ton vecteur.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/09/2006, 12h45
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo