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++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Apparemment, rien ne l'oblige : http://stackoverflow.com/questions/1...ed-by-standard

    Dommage.

    Yan

  5. #5
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    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
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    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

  8. #8
    Expert confirmé
    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
    Points : 4 442
    Points
    4 442
    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 ?)

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    (A moins que tous les problèmes ne soient pas détectés avec des tableaux types C ?)
    ben y as pas de validation de l'index possible dans un tableau C
    tu peux faire ceci sans problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    int toto[4];
     
    toto[-1] = 0;
    toto[4] = 0;
    Le std::array sous visual (je ne sais pas pour les autres compilateur) as un assert sur l'index en debug.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    La Run-Time Check détecte un "stack smashing", mais pas une variable locale qui déborde seulement sur les autres variables locales à la même fonction.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    La Run-Time Check détecte un "stack smashing", mais pas une variable locale qui déborde seulement sur les autres variables locales à la même fonction.
    Ok merci.

  12. #12
    Expert confirmé
    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
    Points : 4 442
    Points
    4 442
    Par défaut
    @yan, je pensais que les tests sur les tableaux C étaient suffisants, my bad.

    Citation Envoyé par Médinoc Voir le message
    La Run-Time Check détecte un "stack smashing", mais pas une variable locale qui déborde seulement sur les autres variables locales à la même fonction.
    Effectivement, après quelques tests supplémentaires, en Debug VS alloue un peu de mémoire avant / après les variables pour détecter les débordements, mais si le débordement arrive sur une autre variable, c'est pas détectable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int after[4];
    int toto[4];
    int before[4];
     
    toto[6] = 0; // OK -> modif de "after"
    toto[5] = 0; // pile corrompue -> espace réservé avant "after"
    toto[4] = 0; // pile corrompue -> espace réservé après "toto"

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    sous visual 2013 avec ce code en debug
    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 <array>
     
     
    struct foo
    {
     int tab[4];
     //std::array<int,4> tab;
    };
     
     
    int main (int argc, char* argv[])
    {
     
        foo * bar = new foo {};
        bar->tab[-1] =0;
     
        return 0;
    }
    * tableau C : aucune détection
    * std::array : assert

    le Run-Time Check n'aurais pas du détecter l'erreur mémoire?

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le cookie de sécurité se trouve quelque part entre les variables locales et l'adresse de retour. Là, tu as écrit de l'autre côté (dans la zone "libre" de la pile).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Non ?
    Pourquoi je voudrais utiliser un std::array en debug et un tableau C en release???

  17. #17
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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

  18. #18
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    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é.

  19. #19
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par yan Voir le message
    Pourquoi je voudrais utiliser un std::array en debug et un tableau C en release???
    Ben parce qu'en debug tu fais tes tests, TU etc, et en release tu laisses inchangé pour t'assurer que le fonctionnement n'a pas changé, notament sur le padding et la sérialisation des données.
    Ca me parait pas plus stupide que de vouloir les changer sans maitriser le scope de tout ça. Puisque je trouve ça toujours inutile depuis mon premier post.
    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.

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Ca me parait pas plus stupide que de vouloir les changer sans maitriser le scope de tout ça. Puisque je trouve ça toujours inutile depuis mon premier post.

    La question est justement de savoirs si le fait de remplacer des tableaux C par un std::array pouvais poser des problèmes dans mon cas. Et la réponse est apparemment oui car la norme ne garantie rien sur l'agencement mémoire .
    Je ne voie pas l’intérêt d'utiliser des structures différent entre la debug et le release. C'est soit l'un soit l'autre.

    Et comme je l'ai expliqué je voulais faire cela pour détecter des index foireux (sans devoir modifier tout le code existant). Ce qui n'est pas possible avec un tableau C. Je ne trouve pas cela inutile.

    Y a aussi d'autre raisons qui donne un intérêt à std::array : https://isocpp.org/wiki/faq/containers

+ 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