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>A zde vidíte reakci na úpravu.
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;
}
![]() | |
| Využití paměti při alokaci 1GB a využití všech prvků v poli. |
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