Dynamiczny przydział pamięci w BCB

0

Jak wiadomo pisząc program dla 16-bitowego systemu DOS przydzielenie pamięci większej niż 640Kb może być "nieco" uciążliwe.
Ale jak to jest w np.: Borland C++ Buildier?
Ile tam można przydzielić maksymalnie pamięci?
Czy programy napisane w BCB korzystają z modelu pamięci jednolitej? :P

WAŻNE (dla mnie): W jaki sposób można sprawdzić ile pamięci można zaalokować? [sciana]
Pisząc program dla DOS'a można skorzystać z funkcji (Borlanda oczywiście) coreleft(), farcoreleft() - zwracają one ilość nie używanych bajtów na stercie (odpowiednio "zwykłej" i rozszerzonej). Przypuszczam, że tutaj tak nie jest... (bo to przecież 32-bity).

Pozdrawiam

0

GlobalMemoryStatus()/GlobalMemoryStatusEx()

0

OK... dzięki za informację (doszedłem do tego korzystając z help'a - dobra rzecz).

Napisałem taki oto programik:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    _MEMORYSTATUS obiekt, *wskaznik;
    int *p;
    wskaznik = &obiekt;
    wskaznik->dwLength = sizeof(MEMORYSTATUS);
    GlobalMemoryStatus(wskaznik);

    ListBox1->AddItem("Wolna pamięć operacyjna (psychiczna): "+IntToStr(wskaznik->dwAvailPhys/1048576)+ "Mb" ,ListBox1);
    ListBox1->AddItem("Wolna pamięć operacyjna (wirtualna): "+IntToStr(wskaznik->dwAvailVirtual /1048576)+ "Mb" ,ListBox1);

    if ((p=(int *)malloc(104857600))!=NULL)
    {
        ListBox1->AddItem("Zaalokowałem 100Mb pamięci poprawnie...",ListBox1);
        GlobalMemoryStatus(wskaznik);
        ListBox1->AddItem("Wolna pamięć operacyjna (psychiczna): "+IntToStr(wskaznik->dwAvailPhys/1048576)+ "Mb" ,ListBox1);
        ListBox1->AddItem("Wolna pamięć operacyjna (wirtualna): "+IntToStr(wskaznik->dwAvailVirtual /1048576)+ "Mb" ,ListBox1);
        free(p);
        ListBox1->AddItem("Zwolniłem pamięć operacyjną..." ,ListBox1);
        GlobalMemoryStatus(wskaznik);
        ListBox1->AddItem("Wolna pamięć operacyjna (psychiczna): "+IntToStr(wskaznik->dwAvailPhys/1048576)+ "Mb" ,ListBox1);
            ListBox1->AddItem("Wolna pamięć operacyjna (wirtualna): "+IntToStr(wskaznik->dwAvailVirtual /1048576)+ "Mb" ,ListBox1);
    }

}

Kiedy go uruchamiam mam takie wyniki:

Wolna pamięć operacyjna (psychiczna): 305Mb
Wolna pamięć operacyjna (wirtualna): 2011Mb
Zaalokowałem 100Mb pamięci poprawnie...
Wolna pamięć operacyjna (psychiczna): 305Mb
Wolna pamięć operacyjna (wirtualna): 1911Mb
Zwolniłem pamięć operacyjną...
Wolna pamięć operacyjna (psychiczna): 305Mb
Wolna pamięć operacyjna (wirtualna): 2011Mb

Wynika z tego, że funkcja malloc() chcąc przydzielić 100Mb, w tym przypadku robi to w pamięci wirtualnej a nie tej... psychicznej (fizycznej?).
Dlaczego tak jest?
Czym różni się pamięć fizyczna od psychicznej?

Pozdrawiam [soczek]

0

Hmm... przecież "physical" to nie to samo co "psyhical"... [wstyd]
Ale mimo wszystko ponawiam pytanie: czym rózni się pamięć fizyczna od wirtualnej (tak w praktyce z punktu widzenia programisty).

PZDR [soczek]

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