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

Langage C++ Discussion :

specification de std::array


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 specification de std::array
    Bonjour.
    J'ai une structure qui contiens un tableau de type C qui est envoyé en brut à travers un réseau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct foo
    {
     int bar[10];
    }
     
     
    foo tmp;
     
    send(&tmp,sizeof(foo));

    j'aimerais savoir si la norme garantie si je peux remplacer le tableau C par std::array sans modifier l'envoie de la structure sur le réseau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct foo
    {
       std::array<int, 10> bar;
    }
     
     
    foo tmp;
     
    send(&tmp,sizeof(foo));
    merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Comme la norme ne spécifie pas le padding, même en n'utilisant que des tableaux C-style, tu n'as aucune garantie que cela fonctionne.
    Encore moins avec std::array.
    Utiliser un Framework de sérialisation serait bien plus simple et judicieux, je pense.

  3. #3
    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 bacelar Voir le message
    Utiliser un Framework de sérialisation serait bien plus simple et judicieux, je pense.
    Tu n'as pas à me convaincre sur ce points
    Malheureusement, c'est dans le contexte du projet...
    A moindre mal, je regarde ce qui est possible pour améliorer certaines chose.
    Remplacer les tableaux C par des std::array en fait partie.

  4. #4
    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
    Apparemment, rien ne l'oblige : http://stackoverflow.com/questions/1...ed-by-standard

    Dommage.

    Yan

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    A mon avis tu aggraves le problème avec std::array car tu perds des garanties sur la disposition en mémoire. Dès qu'il y a des membres avec des accessibilités (private/public/protected) différentes, ce qui est probablement le cas pour std::array, la disposition mémoire devient unspecified: un compilateur respectant le standard pourrait mettre les membres public à un autre endroit que les membres private, par exemple. C'est uniquement lorsque la struct C++ pourrait aussi bien être une struct C que la garantie de contiguïté (hors padding évidemment) tient.

  6. #6
    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,
    Citation Envoyé par stendhal666 Voir le message
    A mon avis tu aggraves le problème avec std::array car tu perds des garanties sur la disposition en mémoire. Dès qu'il y a des membres avec des accessibilités (private/public/protected) différentes, ce qui est probablement le cas pour std::array, la disposition mémoire devient unspecified: un compilateur respectant le standard pourrait mettre les membres public à un autre endroit que les membres private, par exemple. C'est uniquement lorsque la struct C++ pourrait aussi bien être une struct C que la garantie de contiguïté (hors padding évidemment) tient.
    Tiens, pour ce que j'en sais (ou plutot pour ce que je croyais en savoir), l'ordre des données membres non statiques au sein d'une structure (ou d'une classe, vu que les deux fonctionnent de la même manière) ne dépendait que de l'ordre dans lequel les membres étaient déclarés, l'apsect de la visibilité disparaissant complètement dans le résultat final.

    Est-ce que je me trompais si lourdement
    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

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    @koala01: je pense que tu as raison en pratique car c'est l'option retenue par les gros compilateurs mais le standard, selon les renseignements glanés sur stackoverflow, ne garantit qu'un ordre défini (même pas l'ordre de déclaration) par bloc d'accessibilité.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    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 152
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par yan Voir le message
    A moindre mal, je regarde ce qui est possible pour améliorer certaines chose.
    Remplacer les tableaux C par des std::array en fait partie.
    Mué, à ta place je laisserai ces tableaux tranquilles, surtout s'ils ont aussi modifié le padding pour les utiliser et c'est assez courant, surtout que tu dis que ça passe par le réseau.
    Honnêtement, à part se donner "bonne conscience à utiliser les derniers éléments", changer des C-array pour std::array, c'est plutôt inutile amha.
    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.

  9. #9
    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 Bousk Voir le message
    Honnêtement, à part se donner "bonne conscience à utiliser les derniers éléments", changer des C-array pour std::array, c'est plutôt inutile amha.
    La seule raison est que sous visual en debug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::array<int,4> toto;
    toto[4] =1;
    il y as un assert et donc me permet de détecter l’accès mémoire foireux.

    Y as pas de bonne conscience la dedans :p

  10. #10
    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 yan Voir le message
    il y as un assert et donc me permet de détecter l’accès mémoire foireux.

    Y as pas de bonne conscience la dedans :p
    C'est très bien les tableaux aussi



    (A moins que tous les problèmes ne soient pas détectés avec des tableaux types C ?)

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    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 152
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par yan Voir le message
    La seule raison est que sous visual en debug
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::array<int,4> toto;
    toto[4] =1;
    il y as un assert et donc me permet de détecter l’accès mémoire foireux.
    Ben..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct s {
    #ifdef DEBUG
    std::array<int,4> arr;
    #else
    int[4] arr;
    #endif
    };
    Non ?
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/04/2014, 18h49
  2. Réponses: 2
    Dernier message: 23/05/2013, 18h24
  3. Performances std::array C++ 2011 vs C array
    Par Kaluza dans le forum Langage
    Réponses: 6
    Dernier message: 07/12/2011, 18h15
  4. Question sur la classe std::array
    Par Aleph69 dans le forum C++
    Réponses: 4
    Dernier message: 07/07/2011, 17h49

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