Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Jak sprawdzić ile maksymalnie mogę dynamicznie zaalokować pamięci [C]

Ostatnio zmodyfikowano 2015-01-25 11:40
Autor Wiadomość
kizia
Temat założony przez niniejszego użytkownika
Jak sprawdzić ile maksymalnie mogę dynamicznie zaalokować pamięci [C]
» 2015-01-23 10:57:19
Tak jak w temacie, bo internet mówi że się nie da sprawdzić, a wykładowca sądzi coś innego.
Znalazłem że alloc.h może być pomocne ale nic nie mogę go znaleźć w internecie.
Jakieś pomysły?
P-125417
darko202
» 2015-01-23 12:53:07
spójrz na
https://www.youtube.com/watch​?v=0DQl74alJzw
~16 min.

alokacja pamięci polega na przydzielenia dla zmiennej określonego adresu
np. int  4b
 
stąd ograniczeniem maksymalnej ilości jest maksymalna długość słowa bitowego, czyli w systemach 32 bitowych 2^32 = ~4GB, w 64 bitowym 2^64 itd.
(musimy oczywiści wziąć po uwagę, ze ileś tam adresów jest zarezerwowana na zmienne systemowe, inne programy

jeśli int zajmie 4 b
(2^32) / 4 = 4294967296b /4 = 1073741824 zmiennych int

a jeśli jakaś struktura będzie miała np. 102 b
(2^32) / 102 = 42107522 możemy zaalokować tych struktur
P-125421
kizia
Temat założony przez niniejszego użytkownika
» 2015-01-23 15:41:40
Rozumiem ale liczba int mnie nie ogranicza, bo jest to wystarczajaco duzo.
Teraz sprawdziłem  i mogę zaalokować maksymalnie ok. int NUMBER = 480000000; zmiennych przy 8 gigasach, ale  nie o to chodzi, nawet jakby mi tylko 2 zmienne pozwolił zaalokować to bym się nie obraził, nieważne. Tylkoo kwestia jak sprawdzić ile. Tak żeby to śmigało na jednym komputerze gdzie jest 8 gb i na drugim gdzie ramu jest 128 mb. Tą maksymalną wartość dla jakiej mogę utworzyć dynamicznie tablicę.

I próbowałem to zrobić w ten sposób że relokować pamięć i skakać co 16mb i tak w kółko. Realokuję, jeżeli nie mam wsk == NULL to zwiększam moją liczbę elementów i zwalniam tablice, a gdy wreszcie dostanę wsk == NULL to zmniejszam o 16 mb ( przed chwilą udało mi się tyle przydzielić to teraz też powinno ), oczywiście wszystko co było wcześniej zaalokowane jest zwolnione, jedyne co pozostało z poprzedniego procesu to wartość zmiennej dla jakiej udało się zaalokować tablicę. Problem w tym że zazwyczaj dostawałem wynik w granicach 500mb czyli dużo mniej niż tak naprawdę mógłbym zaalokować ( NUMBER = 480000000 - prawdopodobnie 1,7 gb )

Ponoć są jakieś biblioteki do tego żeby to sprawdzić np. spotkałem się z bibliteką alloc.h ale nie mogę jej znaleźć żeby sciagnać, zresztą nie wiem czy się nadaje.
Macie jakieś pomysły jak to sprawdzić, albo znacie jakieś biblioteki które to zrobią?
P-125427
michal11
» 2015-01-23 18:31:07
Mam tylko nadzieję, że to realokowanie robisz sobie w celach edukacyjnych i nie masz zamiaru wykorzystać tego w żadnym normalnym programie.
P-125436
DejaVu
» 2015-01-23 19:03:27
1. Powodzenie lub niepowodzenie alokacji zależy od stopnia pofragmentowania pamięci.
2. Proces 32-bitowy nie może zaalokować więcej jak 2GB pamięci łącznie.

Frazy, które należy wpisać w wyszukiwarkę google:

llocation size limits

The largest possible memory block malloc can allocate depends on the host system, particularly the size of physical memory and the operating system implementation. Theoretically, the largest number should be the maximum value that can be held in a size_t type, which is an implementation-dependent unsigned integer representing the size of an area of memory. In the C99 standard and later, it is available as the SIZE_MAX constant from <stdint.h>. Although not guaranteed by ISO C, it is usually 2CHAR_BIT × sizeof(size_t) − 1.
Źródło: http://en.wikipedia.org/wiki​/C_dynamic_memory_allocation


As per C90 standard guarantees that you can get at least one object 32 kBytes in size, and this may be static, dynamic, or automatic memory. C99 guarantees at least 64 kBytes. For any higher limit, refer your compiler's documentation.

Also, malloc's argument is a size_t and the range of that type is [0,SIZE_MAX], so the maximum you can request is SIZE_MAX, which value varies upon implementation and is defined in <limits.h>.
http://stackoverflow.com​/questions/2798330​/maximum-memory-which-malloc-can-allocate
P-125441
kizia
Temat założony przez niniejszego użytkownika
» 2015-01-23 20:38:22
Zmienna size_t  w żaden sposób mnie nie ogranicza, bo jak to przeliczałem to wychodzi ok 15 gb.
Czyli chyba najwięcej pamięci jestem w stanie zaalokować poprzez taką metodę prób i błędów, dopóki komputer nie odmówi mi pamięci ;d Bo faktycznie przez fragmentację może nie wyglądać tak kolorowo. Ale jakby ktoś znalazł gotową funkcje do sprawdzania tego to proszę dać znać :P
P-125445
pekfos
» 2015-01-23 22:38:40
Jeśli potrzebujesz tyle pamięci, to jeden blok nie jest właściwą strukturą danych.

Zmienna size_t  w żaden sposób mnie nie ogranicza, bo jak to przeliczałem to wychodzi ok 15 gb.
15? Skąd..?
P-125450
kizia
Temat założony przez niniejszego użytkownika
» 2015-01-24 06:38:34
Ale chodzi właśnie o to że ja wcale nie potrzebuję, praktycznie, dużej pamięci, jeżeli dostanę 8 bajtów bo tyle jest mi w stanie przydzielić system to też będzie dobrze, kwestia tylko jak poprawnie spradzać ile faktycznie system w danej chwili ma ochotę przydzielić. Co myślicie o takim właśnie alokowaniu i zwalnaniu pamięci,  takie ręczne sprawdzanie?

unsigned int = 4294967295 * 4 / 1024 / 1024 / 1024 = 15,9
P-125457
« 1 » 2
  Strona 1 z 2 Następna strona