[MinGW] #pragma pack mit Template-Klasse
-
Hi,
ich nutze den Compiler g++ (GCC) 3.3.1 (mingw special 20030804-1).
Ich will das die Membervariablen einer Klasse ohne zusätzliche Alignment Bytes direkt hintereinander im Speicher stehen.
Dazu nutze ich #pragma pack(push, 1). Bei normalen Klassen funktioniert das auch wie gewünscht. Bei Template-Klasse wird es allerdings ignoriert.
Hier der Code:
#include <iostream> #pragma pack(push, 1) class Test1 { private: char member1_; long member2_; }; template<class T> class Test2 { private: char member1_; long member2_; }; #pragma pack(pop) int main() { std::cout << sizeof(Test1) << std::endl; std::cout << sizeof(Test2<int>) << std::endl; std::cin.get(); }
Ausgabe bei oben genannten Compiler:
5
8Bei Visual C++ .NET 7.1 wird wie gewünscht
5
5ausgegeben.
Woran liegt das und wie könnte ich das gewünschte Alignment auch bei Template-Klasse bekommen?
-
#pragma pack ist nicht der gcc-weg.
template<class T> class Test2 { private: char member1_ __attribute__ ((__packed__)); long member2_ __attribute__ ((__packed__)); };
mußt das halt noch als makro wegpacken, damit's bei msvc nicht wirksam ist.
-
Hi volkard.
Schade, ich hatte eigentlich gehofft das mit dem pragma pack bei jedem aktuellen Windows-Compiler durchkomm.
Mir ist in der Zwischenzeit auch noch der Weg über ein char-Array eingefallen. Dieser gefällt mir dann eigentlich besser, da ich dann nicht für jeden Compiler der nochmal was dagegen hat, ein Makro bauen muss.
Ok, ist zwar ein bisschen komplizierter anzusprechen, aber ich brauchte es zum Glück nur für 4 Variablen.Ich werde aber wahrscheinlich auch nochmal in der g++ Newsgroup nachfragen, eventuell ist es ja ein Bug.
Warum sollte es denn eigentlich nicht der gcc weg sein, wenn es bei Nicht-Template-Klassen funktioniert?
Danke volkard.
Bye.