2011-12-20 5 views
6

natknąłem się na następujący kod:Jakie gwarancje ma malloc na temat wyrównania pamięci?

int main() 
{ 
    char *A=(char *)malloc(20); 
    char *B=(char *)malloc(10); 
    char *C=(char *)malloc(10); 
    printf("\n%d",A); 
    printf("\t%d",B); 
    printf("\t%d\n",C); 
    return 0; 
} 
//output-- 152928264  152928288 152928304 

Chcę wiedzieć, w jaki sposób alokacji i wyściółka jest wykonywana przez malloc(). Patrząc na wynik, widzę, że adres początkowy jest wielokrotnością 8. Czy istnieją jakieś inne zasady?

+2

Niezależnie od "reguł", których "nauczysz się" przez badanie tego, co malloc robi na twoim komputerze ... powinno być nieuczone, gdy tylko przejdziesz do innego komputera, lub zmienić opcje kompilatora, lub faza księżyca się zmieni,. .. ... :) – pmg

+3

aby wydrukować wskaźnik naprawdę powinien użyć ' "% s"' i obsady do 'void *': 'printf ("% s", (void *) a);' – pmg

+0

dont naprawdę rozumiem twoje pytanie. –

Odpowiedz

8

Accdording do this documentation page,

adres bloku zwróconej przez malloc lub realloc w GNU jest zawsze wielokrotnością ośmiu lub szesnastu (w systemie 64-bitowa).

Ogólnie rzecz biorąc, implementacje malloc są specyficzne dla systemu. Wszystkie z nich zachować trochę pamięci dla własnej księgowości (np rzeczywista długość przydzielonego bloku), aby móc zwolnić że pamięć poprawnie podczas wywoływania free. Jeśli chcesz dopasować do określonej granicy, użyj innych funkcji, takich jak posix_memalign.

4

jedynie standardową zasadę, jest to, że adres zwrócony przez malloc będą odpowiednio dostosowane do przechowywania wszelkiego rodzaju zmienną. Co dokładnie oznacza to dla konkretnej platformy (ponieważ wymagania dotyczące dostosowania różnią się w zależności od platformy).

0

Dla 32-bitowego systemu Linux:
Kiedy funkcja przydzielania pamięci (malloc) alokuje pamięć, przydziela pamięć w wielu z 8 (padding 8) i przydziela dodatkowy 8 bajt dla księgowości.

Na przykład

malloc (10) i malloc (12) przydziela pamięć 24 bajtów (16 bajtów po wyściółki +8 bajt dla prowad).

malloc() do wypełnienia, ponieważ zwracane adresy będą wielokrotnościami ośmiu, a zatem będą obowiązywały dla wskaźników dowolnego typu. Księgowanie 8 bajtów jest używane, gdy nazywamy funkcję bezpłatną. Bajty księgowe przechowują długość przydzielonej pamięci.

Powiązane problemy