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 :

POD or not POD


Sujet :

C++

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

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut POD or not POD
    Bonjour à tous,

    je suis en train de créer un système d'allocation mémoire en définissant mes propres allocators. Sans rentrer dans les détails je créer plusieurs MACRO pour réaliser des allocations et celle qui me fait me poser des questions est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define CL_IS_POD(type) cl::IntToType<cl::IsPOD<type>::m_value>()
    #define CL_NEW_ARRAY(type,allocator) cl::NewArray<cl::CArray<type>::m_type>(allocator,cl::CArray<type>::m_count,CL_IS_POD(cl::CArray<type>::m_type))
    La macro CL_IS_POD est en fait std::is_pod<T>::value présent dans <type_traits> sous Visual Studio 2010. En fonction de la valeur retourné j'utilise tel ou tel fonction d'allocation.
    cl::CArray est un trick template:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<class T>
    struct CArray{};
    template<class T, size_t N>
    struct CArray<T[N]>
    {
         typedef T m_type;
         static const size_t m_count = N;
    };
    La question est plus "Qu'est ce qu'un POD?" j'ai déjà une réponse mais je m'interroge sur mes connaissances des POD car lorsque je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct pod
    {
        float* p;
    };
    std::is_pod<pod>::value me donne true.
    Et avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class pod
    {
        float* p;
    };
    std::is_pod<pod>::value me donne false.
    Or il n'y a ni constructeur, ni destructeur, ni fonction virtuel membre...
    Est-ce normal?
    J'ai le même résultat avec std::is_pod et std::tr1::is_pod.

    Merci
    Homer J. Simpson


  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    En C++11, la définition des POD a évolué. C++11 FAQ - PODs (generalized)

    Avec GCC 4.8, le programme suivant :
    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
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -std=c++11 -pedantic -fopenmp main.cpp -o main && ./main
    // g++ -Wall -Wextra -Wconversion -Wsign-conversion -std=c++03 -pedantic -fopenmp main.cpp -o main && ./main
     
    #include <iostream>
    #include <type_traits>
     
     
    struct struct_pod
    {
    	float* p;
    };
     
    class class_pod
    {
    	float* p;
    };
     
     
    int main()
    {
    	std::cout << std::is_pod<struct_pod>::value << std::endl;
    	std::cout << std::is_pod<class_pod>::value << std::endl;
     
    	return 0;
    }
    affiche :

  3. #3
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Merci pour le lien.

    Je ne compile pas avec GCC donc ça n'explique pas ce que me fait le compiler de MVS 2010.
    De plus, je viens de trouver un autre chose sympa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class pod
    {
        enum{a,b};
        float p;
    };
    N'est pas un POD pour MVS 2010.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class pod
    {
    public:
        enum{a,b};
        float p;
    };
    Est un POD pour MVS 2010.

    Dans la documentation MVS il ne mentionne pas la class comme POD... http://msdn.microsoft.com/fr-fr/library/bb982918.aspx
    Je présume que c'est encore une fourberie de Microsoft ou c'est standard (avant c++11)?

    Merci encore
    Homer J. Simpson


  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Si tu as des membres private, ta classe n'est pas un POD.
    (normalement, en C++03, std::is_pod n'est pas disponible.)

  5. #5
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Ah!! Donc il me manquait les membres private et protected

    type_traits est disponible partiellement sur Visual Studio 2010 http://msdn.microsoft.com/fr-fr/library/hh567368.aspx Et à ce que je peux lire dans leur documentation, il est marqué comme non implémenté, mais il arrive a avoir un résultat correct avec un hook du compilateur....
    The exposed changes from N2342 "POD's Revisited; Resolving Core Issue 568 (Revision 5)" are the additions of is_trivial and is_standard_layout to <type_traits>. (N2342 reworked a lot of the Core Language wording, but no compiler changes were required.) These type traits were available in Visual C++ in Visual Studio 2010, but they just duplicated is_pod. Therefore, the table earlier in this document said "No" support. They are now powered by compiler hooks that are designed to give accurate answers.

    Merci
    Homer J. Simpson


  6. #6
    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
    Donc, Visual Studio 2013 le supporte correctement, alors que les versions <= 2010 étaient incomplètes (IIRC leur version de is_pod() privilégiait la sécurité, en supposant simplement que tout ce qui n'était pas primitif n'était pas POD: Aucun risque sur la fiabilité du code, mais impact négatif sur les performances).
    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.

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

Discussions similaires

  1. TAD et POD: lever le doute
    Par koala01 dans le forum C++
    Réponses: 7
    Dernier message: 30/12/2008, 19h00
  2. Tri du set pour une POD structure
    Par NiamorH dans le forum SL & STL
    Réponses: 11
    Dernier message: 27/12/2007, 23h05
  3. Clés USB (ou i-pod) invisibles
    Par Aitone dans le forum Périphériques
    Réponses: 11
    Dernier message: 03/01/2007, 12h12

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