Każdy kompilator C oferuje opcję „spakowania” struktur C (np. __attribute__ ((__packed__))
Lub #pragma pack()
). Teraz wszyscy wiemy, że pakowanie jest wymagane, jeśli chcemy wysyłać lub przechowywać dane w niezawodny sposób. Musiało to być również wymagane od pierwszych dni języka C.
Zastanawiam się więc, dlaczego spakowane struktury nie są częścią specyfikacji języka C? Nie ma ich nawet w C99 ani C11, chociaż konieczność ich posiadania jest znana od dziesięcioleci? Czego mi brakuje? Dlaczego jest specyficzny dla kompilatora?
Odpowiedzi:
Chyba dlatego, że zależy to od kombinacji docelowego procesora / kompilatora. Oznacza to, że lepiej być dyrektywą kompilatora (ponieważ jest z tym związana) niż aspekt językowy, ponieważ jak to określić? Jedyny sposób, w jaki mogliby to zrobić, to zjednoczenie.
Artykuł Raymonda daje pewien wgląd w to, dlaczego: http://www.catb.org/esr/structure-packing/
źródło
Istnieją trzy główne czynniki.
Biorąc pod uwagę te czynniki, zarówno standardowy, jak i wszystkie kompilatory C / C ++ rutynowo wypełniają struktury, aby zapewnić optymalne wyrównanie procesora, ale także zapewniają mechanizmy do obejścia tego, jeśli jest to konieczne do celów interop.
To w żadnym wypadku nie zostało przeoczone. Jest to bardzo dobrze zrozumiane, a obecna sytuacja jest z założenia. Najnowsze wersje standardu C ++ mają szerokie wsparcie dla obsługi problemów z wyrównaniem, których być może nie znasz.
źródło
Jest specyficzny dla kompilatora, ponieważ nie znajduje się w standardzie. I nie jest to w standardzie, ponieważ byłoby trudne do określenia w sposób, który nie wymagałby dużo wysiłku implementacyjnego dla kompilatorów niejasnych platform z wymuszonymi ograniczeniami wyrównania.
I żaden z tych wysiłków nie ma większego uzasadnienia, ponieważ każdy kompilator / platforma, o którą dba każdy korzystający z kompilatora C89 lub nowszego, już go ma.
źródło
&
/ /|
operacji odczytu / zapisu wartości każdego pola.