BVP : Velikost pole v C

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Úterý Listopad 14 01:05:46 CET 2000


On Fri, 10 Nov 2000, Ing. Václav Peroutka wrote:

> Rekl bych, mozna protoze to je dvojrozmerne pole 1500x1500 prvku, coz je
> nejakych 2M prvku a neni to INT ale FLOAT, takze to da tech 8MB.

Tech 8 MB pak preleze limit na max. velikost zasobniku (viz ulimit -a) a
proces dostane od kernelu pres drzku.

> Kdyz se da deklarace pred main() tak uz se netvori na zasobniku ? A kde tedy
> ? Mno, to vite, nejsem programator, ale slaboproudar, a v zakladech Cecka
> tohle treba napsane neni...

Existuji tri zakladni oblasti, kde mohou byt data:

1. zasobnik, kam se ukladaji vsechny automaticke promenne (tj. vsechny
lokalni promenne, co nemaji nic, nebo jsou auto), zasobnik je typicky
nekde na konci adresoveho prostoru a v ramci moznosti se automaticky
zvetsuje podle potreby
2. sekce .data (inicializovana data) a .bss (neinicializovana data),
kam se ukladaji vsechny globalni a staticke promenne, v pameti typicky
umisteno tesne za kodem a velikost je fixni
3. heap (ted nevim, jak se tomu spravne rika cesky), coz je oblast, kde
jsou dynamicky alokovana data (malloc() nebo treba C++ove new)

Mate-li nejake obludne velke pole, je asi nejlepsi ho alokovat dynamicky
pres malloc(), je-li jeho velikost urcovana dynamicky a/nebo je-li
pozadovano, aby vystupovalo jako automaticka promenna. Jestlize ma fixni
velikost a nejsou jine duvody ho alokovat dynamicky, pak je to asi prast
jako uhod, jestli malloc() nebo static, i kdyz pri pouziti staticke
promenne muze byt kod o chlup efektivnejsi (neni-li to PIC, tedy
relokovatelny kod pro sdilene knihovny, tam je naopak vhodne se statickym
promennym vyhnout).

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."



Další informace o konferenci Linux