2017-05-31 1 views
0

Je sais que l'empaquetage de structure est une chose commune dans la programmation C++ (au moins sur les systèmes à faible mémoire). Mais qu'en est-il des classes. Je sais que cela fonctionne parce que je l'ai essayéEmballage de classe C++/alignement des membres

#include <iostream> 

#pragma pack(push, 1) 
class Test_Packed { 
    uint8_t t; 
    uint32_t test; 
}; 
#pragma pack(pop) 

class Test_Unpacked { 
    uint8_t t; 
    uint32_t test; 
}; 

int main() { 
    std::cout<<sizeof(Test_Packed) << "/" << sizeof(Test_Unpacked)<<std::endl; 
    return 0; 
} 

qui sort correctement "5/8". Puis-je supposer que c'est le cas sur tous les compilateurs conformes, ou cette implémentation est-elle définie?

Je sais que l'ajout de membres virtuels (et donc la nécessité d'un vtable) ajoutera des données supplémentaires au premier plan. Quelles peuvent être d'autres raisons pour que cela échoue? Cela peut-il causer des problèmes, à l'exception de mauvaises performances sur certaines plates-formes?

+2

Sa mise en œuvre est définie. –

Répondre

1

La documentation pour #pragma états:

comportement défini de mise en œuvre est contrôlée par #pragma directive.

Ainsi, l'effet, le cas échéant, de #pragma pack(push, 1) et #pragma pack(pop) est complètement "implémentation."