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 :

Question liée à memset


Sujet :

C++

  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut Question liée à memset
    Salut tout le monde !

    J'aimerai modifier (accélérer) les deux boucles suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    px = new int[output_width];
    for(i=0; i<crop_x0; i++)  px[i] = -128;
    for(i=crop_x0+crop_w; i<output_width; i++)  px[i] = -128;
    J'ai pensé à memset() mais je ne pense pas que ce soit possible...
    Pouvez-vous m'éclairer ?

    Merci d'avance !

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Pour ce que j'en sais, un memset ne sera pas plus rapide qu'une boucle for. Je dirais même plus: je ne connais rien de plus rapide qu'une boucle for pour initilialiser un tableau, surtout si c'est un tableau d'entiers.

  3. #3
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    OK.
    J'ai une autre question, bête .
    J'ai deux tableaux, initialisés avec des valeurs, et j'aimerais avoir un pointeur qui pointe sur l'un, ou l'autre, en fonction d'un flag...
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int **p1;
    static int tab1[16][10]={0};
    static int tab2[16][10]={1};
     
    if (flag)
    {
      p1=(int **)tab1;
    }
    else
    {
      p1=(int **)tab2;
    }
    Mais ça ne fonctionne pas...
    L'erreur doit être bête, mais je ne la vois pas.


    EDIT : J'ai modifié le code, comme indiqué ci-dessus, et ça fonctionne.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu ne peux pas pointer sur un tableau à deux dimensions avec un int* ou un int**.
    Tu ne peux pas non plus transtyper un tableau statique à deux dimensions en pointeur sur pointeur d'int. Ca ne représente pas du tout la même chose en mémoire.

    La solution est de donner le bon type à p1 (référence sur tableau à deux dimensions) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static int tab1[16][10]={0};
    static int tab2[16][10]={1};
    int (&p1)[16][10] = flag ? tab1 : tab2;
    Tu peux aussi utiliser un pointeur (int (*tab)[16][10]) si tu dois réaliser l'affectation après la déclaration.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    2 remarques:

    1/ La solution que tu proposes (progfou) ne fonctionne pas. Pour s'en convaincre, rajoute la ligne suivante aprés l'affectation de p1:
    Pourquoi? Laurent l'a trés bien expliqué. D'ailleurs, je l'ignorais, merci Laurent

    2/ Le code:
    va initialiser à 0 uniquement la première 'case' de ton tableau.

  6. #6
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Oui, tout à fait, je me suis pris un segmentation fault .
    Merci laurent .

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    va initialiser à 0 uniquement la première 'case' de ton tableau.
    Je crois que c'est une syntaxe valide pour initialiser tout le tableau. La règle générale étant que s'il n'y a pas assez d'initialiseurs, le dernier est pris pour initialiser les éléments restant.

  8. #8
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Ha. Parce qu'en fait, ne trouvant pas la solution à ce problème de memset, j'ai testé des trucs, et je me suis rendu compte que le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int tab[3][5]={1};
    for (int i = 0; i<3; i++){
    	for (int j=0; j<5; j++)
    		cout << tab[i][j];
    	cout << endl;
    }
    me sors l'output suivant:
    Citation Envoyé par console
    10000
    00000
    00000
    Avec visual 2005.

  9. #9
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Les tableaux sont des exemples, en fait, ils ont une série de valeur, mais c'est trop gros pour passer ici, et ça ne sert à rien .

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    ha oui, une dernière remarque:
    il est tout de même beaucoup plus pratique de manipuler des tableaux à 1 dimensions qu'à 2 dimensions... et encore plus pratique d'utiliser des vecteurs (std::vector)... et il y a également le boost::multi_array qui est trés pratique.

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Laurent Gomila
    Je crois que c'est une syntaxe valide pour initialiser tout le tableau. La règle générale étant que s'il n'y a pas assez d'initialiseurs, le dernier est pris pour initialiser les éléments restant.
    Les elements restants sont initialise a 0.

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ah d'accord... Merci pour la précision.

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pour ce que j'en sais, un memset ne sera pas plus rapide qu'une boucle for. Je dirais même plus: je ne connais rien de plus rapide qu'une boucle for pour initilialiser un tableau, surtout si c'est un tableau d'entiers.
    memset sera potentiellement plus rapide, si, car il écrira par paquets et exploitera la vectorisation.
    Mais notre ami ne peut pas utiliser memset puisqu'il ne veut pas donner à chaque octet une valeur x.

    Edit: s/virtualisation/vectorisation/

  14. #14
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Pourtant dans son code il initialise chaque octet à -128?

  15. #15
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par coyotte507
    Pourtant dans son code il initialise chaque octet à -128?
    Chaque int.

  16. #16
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par loufoque
    memset sera potentiellement plus rapide, si, car il écrira par paquets et exploitera la vectorisation.
    Est-ce que tu aurais des sources qui parlent de ça s'il te plait? Parce que je ne trouve rien sur le sujet (gotw, faqs, ...)

    edit: je précise un peu les raisons de mon interrogation: les compilateurs sont sensés dérouler les boucles, et il me semble que le résultat revient au même que le traitement par paquet.

  17. #17
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par coyotte507
    Pourtant dans son code il initialise chaque octet à -128?
    Dans le cas présent, c'est un tableau de int (4 octets). Or memset fonctionne par octet uniquement.

  18. #18
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Je n'ai pas suivit la discution de prés, mais il y a un exemple sur boost.org qui peut etre interessant pour vous :

    http://www.boost.org/libs/type_trait...ll_example.cpp

    il semblerai que les librairies standart courante integre déjà ces optimisations... En tout cas chez moi je n'ai aucune difference (en release). S'il est possible de faire "mieux", ça m'interesse ^^

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par r0d
    ha oui, une dernière remarque:
    il est tout de même beaucoup plus pratique de manipuler des tableaux à 1 dimensions qu'à 2 dimensions... et encore plus pratique d'utiliser des vecteurs (std::vector)... et il y a également le boost::multi_array qui est trés pratique.
    lol,
    j'y croi pas que std::vector est aussi rapide qu'un tableau
    c'est juste plus securisé.
    Puis le prob d'un tableau c'est comme tout faut savoir s'en servire

  20. #20
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    j'y croi pas que std::vector est aussi rapide qu'un tableau
    Pourtant, c'est le cas.
    Pourquoi ça ne le saurait pas ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [1.x] Questions liées au getRelatedModelName()
    Par Gauldo dans le forum Symfony
    Réponses: 7
    Dernier message: 01/02/2010, 15h01
  2. [WAMP] Questions liées au réseau
    Par steeve93800 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 08/02/2008, 12h33
  3. [Htaccess] Petites questions liées à la sécurité
    Par jeanphi6 dans le forum Apache
    Réponses: 4
    Dernier message: 21/11/2007, 08h50
  4. Petite question liée aux structures
    Par progfou dans le forum C++
    Réponses: 9
    Dernier message: 24/04/2007, 13h46
  5. Petite question liée au Javascript
    Par systemofaxav dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/03/2006, 14h29

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