Witam, wszystkich. Dawno tu nie byłem. Mam nadzieję, że są tu jeszcze starzy dobrzy wyjadacze (młodzi też mile widziani).
Natrafiłem na intrygujący kłopot ze strukturą i jej wielkością:
#include <cstdio>
#include <conio.h>
#include <iostream>
using namespace std;
struct S1
{
char a;
char b;
char c[5];
char d;
short e;
char f;
char g;
char h[4];
char i[4];
char j;
} ;
struct S2
{
char a;
char b;
char c[5];
char d;
// short e;
char f;
char g;
char h[4];
char i[4];
char j;
} ;
int main(int argc, char *argv[])
{
cout << sizeof(S1) << " " << sizeof(S2);
getch();
return 0;
}
Gdzie tkwi problem? Policzcie co powinien pokazać w konsoli jako wynik. Testowałem to na G++ i wynik mam zarówno pod windowsem jak i linuksem różnicę 3 bajtów. A przecież to różni się tylko o short, który też sprawdziłem i ma 2 bajty. Gdzie tkwi problem i skąd ta różnica?
Zrobiłem również drugi test na GCC i to samo. Wrzuciłem zgodność z ANSI C i ten sam wynik. Ale już na AVR-GCC jest wynik różnicy o 2 bajty.
No i nic nie rozumiem. Jeszcze możliwa jest tu jakaś optymalizacja, żeby było jakieś wyrównywanie, ale niby do czego ma to być wyrównywane, skoro jest 19 bajtów i 22 bajty a 21 być nie chce z shortem ale bez problemów jest kiedy są same char.
No więc coś mi tu nie gra, bo to wydawało mi się do tej pory zawsze możliwe i proste do policzenia, a tu zdziwienie.
Problem jest to, że wielkość tablicy się różnić może nawet o kilka bajtów a nie tylko jeden, chociaż elementy ułożone są tak jak wynika to z ich wielkości. Więc niby można przekopiować 1:1 ale tylko w przypadku jednej zmiennej, podczas gdy tablice struktur różnią się wielkością tablicy źródłowej, więc trzeba kopiować element po elemencie, co trochę jest dziwne.
Może jakiś parametr kompilacji aby się tego pozbyć?
Obecnie testowałem tylko
-Os i -O2 w celu sprawdzenia, w obu przyp. tak samo.