Jak sprawdzić ile maksymalnie mogę dynamicznie zaalokować pamięci [C]
Ostatnio zmodyfikowano 2015-01-25 11:40
pekfos |
» 2015-01-24 09:52:35 Co myślicie o takim właśnie alokowaniu i zwalnaniu pamięci, takie ręczne sprawdzanie? |
Ale po co chcesz to wiedzieć? Ilość wolnej pamięci ogółem możesz pobrać przez WinAPI. A jak system odmówi zaalokowania pamięci, to dostaniesz pusty wskaźnik/wyjątek - na to powinieneś reagować. Jeśli koniecznie chcesz wiedzieć, że w jakimś krytycznym kodzie nie zabraknie nagle pamięci, zaalokuj własną pulę i sam nią zarządzaj. System nie odmówi ci pamięci, która i tak jest już twoja. unsigned int = 4294967295 * 4 / 1024 / 1024 / 1024 = 15,9 |
2^32 / 2^30 = 4 GB. |
|
Monika90 |
» 2015-01-24 10:10:04 |
|
kizia Temat założony przez niniejszego użytkownika |
» 2015-01-24 14:39:50 Mnie to do szczęścia niepotrzebne, jestem szczęśliwy bez tego, ale moj wykładowca chyba nie bardzo. Zostawmy ten problem bo skoro nie ma jakiegoś normalnego rozwiązania to znaczy że nie jest to istotny problem, a zrobie to tak jak mówiłem, zwiększając aż system odmówi. Tylko wytłumaczyłbyś Pekfos jak powienienm to liczyć. Bo ja to rozumiem tak, że t_size może przyjąć maksymalną wartość 4294967295, czyli tyle elementów int mogę stworzyć czyli mnożę to razy 4 i wychodzi mi liczba bajtów jaką to zajmuje. Jak powinienem to rozumieć? |
|
DejaVu |
» 2015-01-24 14:47:13 Bo ja to rozumiem tak, że t_size może przyjąć maksymalną wartość 4294967295, czyli tyle elementów int mogę stworzyć czyli mnożę to razy 4 i wychodzi mi liczba bajtów jaką to zajmuje. Jak powinienem to rozumieć?
|
Malloc alokuje BAJTY, a nie INT-y. Poza tym maksymalna wartość jaką można przekazać do funkcji nie oznacza wcale, że aż tyle uda się zaalokować. |
|
kizia Temat założony przez niniejszego użytkownika |
» 2015-01-24 15:11:29 Racja racja po prostu najpierw używałem calloc a wtedy podaje osobno rozmiar i ilość elementów. Obliczam to mniej więcej w ten sposób, co o tym myślicie ? while( 1 ) { bigSize += 10485760; if( bigSize >= 4294967294 ) { printf( "BUUUM!" ); return 0; }
pInt[0] = ( int *) realloc( pInt[1], 1 * sizeof(int) ); pInt[1] = ( int *) realloc( pInt[0], bigSize * sizeof(int) );
if( pInt[1] == NULL ) { printf("Too much.%d\n", bigSize ); bigSize -= 10485760; free( pInt[0] ); break; } }
|
|
kizia Temat założony przez niniejszego użytkownika |
» 2015-01-25 11:39:54 Myślę że jest spoko |
|
kizia Temat założony przez niniejszego użytkownika |
» 2015-01-25 11:40:11 Oki, dzięki to zamykam temat |
|
1 « 2 » |