2010-01-18 6 views
12

Tło: Kompilator może wstawić dopełnienie do struktury, aby ułatwić jej wyrównanie. To spowoduje, że rozmiar struct będzie większy niż suma rozmiarów jego członków. Ponowne uporządkowanie elementów struktury, aby lepiej się spakować, może usunąć potrzebę kompilatora w taki sposób, aby zredukować strukturę pamięci. Muszę uzyskać te oszczędności w pamięci.Jak znaleźć wszystkie elementy, które można zmniejszyć, zmieniając kolejność ich elementów.

Opcja awaryjna polega na ręcznym sprawdzeniu każdej struktury. Szukam automatycznego podejścia, które może zmniejszyć wysiłek.

Nawet jeśli ogranicza liczbę kontrolek ręcznie, które mogłyby pomóc.

Na przykład proces/narzędzie/etc, które wymienia wszystkie elementy, które są większe niż suma rozmiarów ich elementów, ale nie jest doskonałe, nadal byłoby pomocne, ponieważ ograniczałoby te, które należy ręcznie sprawdzić .

Czy ktoś wie o jakichkolwiek narzędziach, które mogą to zrobić, lub czy ktoś może zaproponować jakieś podejście, które mogłoby pomóc.

p.s. Muszę to zrobić na osadzonej bazie kodu C zawierającej ponad milion linii kodu.

+1

Większość kompilatorów ma opcję ścisłego spakowania struktur - w MSVC++ jest to '/ Zp', na gcc to' -fpack-struct'. Należy pamiętać, że (1) spowoduje to przerwanie kompatybilności ABI z innym kodem i (2) większość procesorów będzie obsługiwać niewyrównane dane uzyskując dostęp wolniej (lub w ogóle w niektórych architekturach). –

Odpowiedz

10

pahole to narzędzie napisane dla tego konkretnego celu. Analizuje skompilowane pliki obiektów (skompilowane z włączonym debugowaniem) i pokazuje dziury w strukturze.

+0

wrócił i wznowił cię, wykorzystawszy go teraz, muszę powiedzieć, że pahole jest niesamowite –

1

Można napisać program, który z kolei wypisze mały program w języku C dla każdej permutacji pól w strukturze, a gdy program wyjściowy zostanie skompilowany i uruchomi jego wydruki na rozmiar struktury. Stanie się to niepraktyczne, jeśli liczba pól stanie się znacznie większa niż 10 lub więcej.

+0

To nie ma większego sensu. Ogólnie rzecz biorąc, uporządkowanie pól od największej do najmniejszej generuje optymalne wypełnienie. –

+1

@Anon czy to pozostanie prawdą, jeśli niektóre rozmiary nie są potęgami dwóch, na przykład 10-bajtowych rozszerzonych podwójnych lub nawet 'char t [5]'? –

+0

Tablica 'char' powinna być uporządkowana z innymi' char's - być może byłoby dokładniej powiedzieć, że pola powinny być uporządkowane według wymagań wyrównania. –

1

CIL to solidny parser C napisany w OCaml, który rozumie dopełnienie struktur. Pochodzi z programem wykrywającym C. Podszewka strukturalna jest specyficzna dla platformy, nie wątpię, że o tym wiesz, ale mógłbyś wyjaśnić swoje pytanie. Program wykrywania spakowany przy pomocy CIL wykrywa rozmiar typów, a algorytm przyjmowany przez CIL służy do wypełniania struktur, polega na tym, że przesunięcie pola n-tego jest obliczane przez zaokrąglenie w górę (przesunięcie pola (n-1) -th + wielkość pola (n-1) -th) do najbliższej wielokrotności (wyrównanie n-tego pola).

To byłoby mniej niż 200 linii OCaml do wykonania potrzebnego narzędzia, zaczynając od CIL. Ale mogą być jeszcze lepsze rozwiązania.

9

Opcja ostrzeżenia gcc -Wpadded może być używana do informowania o wyściełaniu struktury. To nie powie Ci, kiedy struktura może być mniejsza, ale może pomóc zmniejszyć pracę.

+0

Czuję się idiotą, ponieważ nie znalazłem już tej opcji. –

Powiązane problemy