[C++] Obiekty i ich miejsca w pamięci


(Quentin) #1

Witam!

Chciałbym się dowiedzieć czy dobrze przyporządkowuję obiekty (zmienne) do ich miejsc w pamięci. Pytam tak z ciekawości :stuck_out_tongue:

:arrow: Obiekty tworzone operatorem new ----> Sterta (ang. heap, free store)

:arrow: Obiekty lokalne automatyczne ----> Stos (ang. stack)

:arrow: Obiekty globalne i obiekty statyczne ----> Normalny obszar pamięci

:arrow: Obiekty z przydomkiem register ----> Rejestr procesora

Z góry dzięki za odp :slight_smile:


([alex]) #2

Nie koniecznie. Pamiętaj że operator new może być przeciążony i obiekt może się tworzyć właściwie gdziekolwiek (oprócz rejestrów rzecz jasna).

To nie jest do końca prawda, klauzula register jest pobożnym życzeniem programisty, którego kompilator nie ma obowiązku spełniać.


(B Brachaczek) #3

Ponadto kompilatory z włączonymi optymalizacjami lubią robić różne nieprzewidywalne rzeczy, np. często obiekty automatyczne znajdują się w rejestrze procesora, nawet bez klauzuli register. Dlatego czasem trzeba uważać ze wstawkami asemblerowymi, jeśli ktoś takowe z jakichś powodów stosuje. Ale to jest osobny temat :wink: .


(Quentin) #4

Mam jeszcze dwa pytania:

1) Obiekty z przydomkiem register mogą być też typu zmiennoprzecinkowego, prawda :?: Zostaną wtedy umieszczone (jeżeli kompilator się na to "zgodzi" jak wspomniał [alex]) w FPU.

2) Na Wikipedii jest napisane, że przepełnienie sterty to jeden z rodzajów przepełnienia bufora. Wychodzi na to, że sterta to bufor, ale przecież bufor to obszar pamięci, który jest wykorzystywany gdy jedno z urządzeń komputera nie jest w stanie w danej chwili odebrać danych kierowanych do niego. Program to nie urządzenie komputera - o co chodzi :?:


(Fiołek) #5

Bufor to dość ogólne pojęcie i nie oznacza tylko tego co opisałeś :wink:


(Quentin) #6

Aha, chyba, że tak :slight_smile:

Jeszcze oprócz tego pytania z poprzedniego postu mam trzy kolejne:

2) Na Wikipedii jest napisane, że przepełnienie sterty powoduje nadpisanie struktur kontrolnych programu. Czym są te struktury :?: Bo z tego co znalazłem, to w PHP to są np. instrukcje warunkowe i pętle oraz instrukcja switch. Jeżeli w C++ jest tak samo, to to przepełnienie nadpisuje jakby wnętrze programu, tak :?:

3) Dlaczego przepełnienie stosu powstaje już przy przekroczonej granicy ok. 1MB na zmienne lokalne :?: Przecież wielkie programy mają po kilkanaście GB - OK, trochę miejsca zajmują też zmienne globalne, które na stosie zakładane nie są, ale podkreślam trochę.

4) Odnośnie normalnego obszaru pamięci (w którym alokowane są zmienne globalne i statyczne) to w architekturze x86 granica o ile wiem wynosi 2GB, a w x64 nie ma już ograniczeń, prawda :?:


(Xwars) #7

Na stosie jest na przykład adres pod który skoczy program po powrocie z funkcji. Więcej w klasycznym 13 letnim artykule:

Smashing the Stack for Fun and Profit

Wielkość stosu zależy od systemu operacyjnego, kompilatora i jego opcji. A stos przepełnić można i funkcją rekurencyjną beż żadnych zmiennych lokalnych - bez optymalizacji wywołanie funkcji najczęściej oznacza wrzucenie kilku rejestrów na stos - dla "pusha" jest to (AX, CX, DX, BX, SP, BP, SI, DI) - w kodzie 32 bitowym oznacza to 8*4=32 bajty na każde wywołanie funkcji( plus jeszcze adres powrotu).