Unia C++, dziwne zachowanie w Code::Blocks

0

Mam taki kod:

 
#include <iostream>
using namespace std;
union UniVar
{
        char c;
        short s;
        int i;
        long l;
        float f;
        double d;
        long double ld;
};
int main()
{
        cout << "sizeof(UniVar): " << sizeof(UniVar) << endl;
        cout << "sizeof(long double): " << sizeof(long double) << endl << endl;
        return 0;
}

Teraz do rzeczy. Jak widać kod pokazuje nam, ile miejsca w pamięci zajmuje zmienna typu UniVar, a ile long double (poprawniej chyba będzie użyć sformułowania rozmiar w odniesieniu do wielokrotności miejsca zajmowanego przez typ char, ale ten, z tego co mi wiadomo w 100% przypadków zajmuje dokładnie jeden bajt). Obie wartości (teoretycznie) powinny być równe, bo zgodnie z definicją wielkość unii jest równa wielkości największego typu, będącego elementem danej struktury. Teoretycznie.

Testowałem kod na Ideone.com, wszystko jest tak, jak być powinno: http://ideone.com/Ex1WC , czyli:

sizeof(UniVar)==sizeof(long double) //true

Ciekawostka powstała mi po skompilowaniu tego w środowisku Code::Blocks, otóż tam rozmiary obu typów są różne. Rozmiar typu reprezentowanego przez unię jest większy niż powinien być. Poniżej screen.

user image

Może ktoś to wyjaśnić ? Może o czymś nie wiem :)

4

One place where sizeof might return something larger is when a long double is being used. A long double is 10-bytes but Intel recommends aligning at 16-bytes. – dreamlax Apr 15 '09 at 23:14

http://stackoverflow.com/questions/740577/sizeof-a-union-in-c-c

0

Nie jestem pewny ale jak wsadzisz tę unię między

#pragma pack(push,1)
<tutaj unia="unia">
#pragma pack(pop)

to chyba uzyskasz oczekiwany wynik.

0

mały błąd przed pragma umieść # czyli
#pragma pack(push, 1)
#pragma pack(pop)

0

# cos jest na 4p zamieniane "dla ułatwienia" (ciekawe komu) na liste numerowaną:

cos

0

@xxx_xx_x_

Rzeczywiście, to działa: http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx :)

 
#include <iostream>
#define S(A) cout << #A << ": " << (A) << endl;
using namespace std;
#pragma pack(push,1)
union UniVar
{
        char c;
        short s;
        int i;
        long l;
        float f;
        double d;
        long double ld;
};
#pragma pack(pop)
int main()
{
        S(sizeof(UniVar));
        S(sizeof(long double));
        return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1