Mise en page est la façon dont les membres d'un objet de classe, de structure ou d'union sont disposés dans la mémoire. Très souvent, le langage spécifie la disposition, mais s'il y a quelque chose comme une fonction virtuelle, une classe de base virtuelle, etc, alors le compilateur est libre de choisir la disposition et celle-ci peut ne pas être contiguë. Cela conduit à plusieurs problèmes : nous ne pouvons pas sérialiser l'objet de manière appropriée ou le transmettre à des programmes écrits dans d'autres langages comme le C ou à des fonctions comme memcopy, car nous ne pouvons pas copier les données de manière fiable en nous assurant qu'elles ne sont pas dans des emplacements contigus.
Afin de permettre aux compilateurs et aux programmes c++ de supporter les opérations mentionnées ci-dessus, c++ a introduit 3 catégories pour les structures et les classes simples.
Trivial
Une classe ou une structure est triviale si elle respecte les règles :
- pas de fonction virtuelle ou de classe de base virtuelle
- pas de constructeur/opérateur/destructeur défini par l'utilisateur
- la classe de base doit être triviale
- tous les membres de la classe doivent être triviaux
Si une classe est triviale, sa disposition est contiguë mais il peut y avoir un remplissage en conséquence et le compilateur est libre de choisir l'ordre des membres dans la disposition. Nous pouvons avoir différents spécificateurs d'accès dans la même classe et si nous utilisons un constructeur paramétré, nous devons évidemment spécifier le constructeur par défaut. Mais si vous voulez garder la classe triviale alors vous devriez explicitement faire le constructeur par défaut.les constructeurs devraient être publics.
Modèle standard
- Pas de fonctions virtuelles et de classe de base virtuelle
- Tous les membres non statiques doivent avoir les mêmes spécificateurs d'accès.
- Tous les éléments non statiques doivent avoir une disposition standard.
- Toutes les classes de base doivent avoir une présentation standard
- Tous les membres de la classe de base doivent être statiques.
- Le type de la classe de base et du premier membre non statique de la classe ne doit pas être le même.
La mise en page standard est bien définie et elle peut être mémorisée de manière fiable et transmise aux programmes C de manière appropriée. Les fonctions de mise en page standard peuvent également avoir des fonctions spéciales définies par l'utilisateur comme le constructeur et le destructeur.
POD (Plain old data)
Si une classe ou une structure est à la fois triviale et standard, on dit qu'elle est POD. Chaque membre est stocké dans l'ordre spécifié lors de la déclaration de l'objet. Les classes POD doivent avoir des membres de données non statiques POD. Les classes POD peuvent être copiées ou transmises à des programmes C de manière fiable.
Programme C++ avec une classe qui est triviale, à disposition standard et donc POD.
#include<iostream>
#include<type_traits>
class xyz
{
public:
int a;
int b;
xyz() = default;
xyz(int x, int y) :a(x), b(y) {}
};
int main() {
std::cout << std::is_trivial<xyz>() << std::endl;//true
std::cout << std::is_standard_layout<xyz>() << std::endl;//true
std::cout << std::is_pod<xyz>() << std::endl;//true
}
Types littéraux
Pour un type littéral, la disposition peut être déterminée au moment de la compilation. Des exemples de types littéraux sont void, des types scalaires tels que int, float, etc, des références, des tableaux de void, de types scalaires ou de références et une classe qui a un destructeur trivial et un ou plusieurs constructeurs constexpr qui ne sont pas des constructeurs move ou copy. ne sont pas des constructeurs de déplacement ou de copie. En outre, tous ses membres de données non statiques et ses classes de base doivent être de type littéral et non volatile.
3 votes
Je pense qu'il est un peu tard pour en parler. Mais pour les personnes qui cherchent une réponse détaillée et élaborée, voici le lien. Consultez la réponse de R Martinho Fernandes stackoverflow.com/questions/4178175/