pátek 27. ledna 2012

Chytrost systému při alokaci paměti

Při čtení knížky Mistrovství v C++ mě napadlo si něco vyzkoušet. Vždycky mě zajímalo jak se zachová systém na alokaci velkého pole. A to myslím hodně velkého.

Vezměme např. pole znaků o 1 miliardě prvků. To je miliarda bytů, jelikož char je velký přesně 1 byte. Zkoušet něco takového na zásobníku, je blbost, protože kdykoliv spustíte tento program, tak ihned spadne. Takže musíme alokovat paměť na hromadě (heap). V jazyce C++ nám k tomu slouží operátor new [].



Napsal jsem si jednoduchej program v C++. Program vypadá následovně. (Velikost jsem upravil na 1GB, aby to nějak vypadalo.)

#include <iostream>
using namespace std;

#define SIZE 1073741824                                        // == 1GB

int main()
{
    int a;
    char * name = new char [SIZE] ;
    cout << "naplneno" << endl;
    cin >> a;                                                    // pozastavení programu
   
    delete [] name;
    return 0;
}

Zkompiloval a spustil. Následně mě překvapila velikost ve skutečnosti alokované paměti.
Červeně podtržený řádek.
Využitá paměť při alokaci 1GB.

Pak mě napadlo jestli třeba systém nealokuje paměť pro program, ale až při použití. Jakože když nastavím prvek, který se nachází v půlce pole, tak systém alokuje polovinu. Reakci vidíte na obrázku.
Využití paměti při alokaci 1GB a použití jednoho prvku.

Po tomhle zjištění jsem zkontroloval, jsetli jsem správně napsal číslo SIZE. Oči nelhaly a číslo bylo správně. Tak jsem udělal cyklus, který zapíše do každého prvku hodnotu. Úprava nebyla velká, jen jsem přidal cyklus for a bylo to (brnkačka ne?).
#include <iostream>
using namespace std;

#define SIZE 1073741824                                        // == 1GB

int main()
{
    int a = 1;
    char * name = new char [SIZE] ;
    for (int i = 0; i < SIZE; i++)
    {
        name[i] = 'a';
    }
    cout << "naplneno" << endl;
    cin >> a;                                                    // pozastavení programu
   
    delete [] name;
    return 0;
}
 A zde vidíte reakci na úpravu.
Využití paměti při alokaci 1GB a využití všech prvků v poli.
Snímek je pořízen ihned po skončení cyklu. Je to vidět i z grafu využití procesoru.

Zdá se, že systém ve skutečnosti přiřadí paměť až ji program potřebuje a využívá.

Pokud máte jiný systém než Mac, tak to zkuste a napište třeba do komentářu. Jsem zvědav jestli to dělá každý systém.

Žádné komentáře:

Okomentovat