Dostępna pamięć przy dynamicznej alokacji.

0
 #include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <new>

using namespace std;

long k;

void funkcja_alarmowa()
        {
            cout<<"\n zabraklo pamieci przy k="<<k<<"!\n";
            exit(1);
        }

int main()
{
 
        set_new_handler(funkcja_alarmowa);
        for(k=0;;++k)
        {
            new int;
        }
    }

wynik k=133293580 * 4bajty == 533megabajty
ale menadżer zadań Windows pokazał mi że program zajął 2GB pamięci.

Z czego wynika taka różnica?

3

Skąd wiesz, że każde new zaalokowało 4 bajty? Prawie na pewno tak się nie stało.

Alokator musi też gdzieś zmieścić różne dane dotyczące tej alokacji (np. ile ma zwolnić miejsca przy delete). Dodatkowo od systemu operacyjnego prawdopodobnie zażądał od razu znacznie więcej na poczet przyszłych alokacji. Po trzecie sprawdzanie zużycia pamięci za pomocą jakiegokolwiek managera zadań może być mało miarodajne, użyj czegoś lepszego np. massifa (jedno z narzędzi Valgrinda).

Poza tym samo new czy malloc to nie wszystko. Te funkcje ostatecznie tylko "pobierają" pamięć od systemu operacyjnego (no chyba, że go nie ma, ale to inna sprawa). Sam system operacyjny może mieć najdziwniejsze strategie jej przydzielania i zarządzania tym. Np. na Linuksie alokacja prawie zawsze się udaje, nawet jeżeli zażąda się ogromnych ilości pamięci. To dlatego, że kernel pamięć fizyczną przydzieli dopiero wtedy, kiedy ten zaalokowany obszar będzie pierwszy raz użyty. Dopiero wtedy może się okazać, że już nie ma z czego przydzielać (nazywa się to overcommit). Oczywiście to nie ma powiązania z podanym przez Ciebie przykładem, chodzi o to, że to przydzielanie pamięci może nie być takie oczywiste jak się wydaje.

Podsumowując, jeżeli nie zna się szczegółów działania alokatora i systemu operacyjnego trudno powiedzieć dlaczego ta wartość k wyszła jaka wyszła.

1 użytkowników online, w tym zalogowanych: 0, gości: 1