Maximalna velkost pola v jazyku C

Warchangel

Maximalna velkost pola v jazyku C
« kdy: 14. 04. 2012, 12:42:11 »
Dobry den,

  chcel som sa opytat, ci je velkost jednorozmerneho pola v jazyku C nejak obmedzena. Pretoze potrebujem jednorozmerne pole typu long, ktore bude mat maximalne 1 000 000 prvkov. Ale ked v programe napisem "long pole[1000000]" a dam spustit program, tak mi to hned pri starte vyhodi chybu. Ale ked pouzijem "long pole[500000]", tak vsetko funguje ako ma.

popripade, neviete ako tento problem vyriesit, aby som mohol mat " long pole[1000000]"?

Za odpovede vopred dakujem.
« Poslední změna: 15. 04. 2012, 13:51:34 od Petr Krčmář »


anonym.

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #1 kdy: 14. 04. 2012, 12:50:34 »
Ahoj,
zkus to zkompilovat c++ kompilatorem, c++ by nemelo mit zadne omezeni, co se tyce velikosti pole (alespon co jsem teda slysel, jeste jsem to nezkousel)

aaaaaaaa

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #2 kdy: 14. 04. 2012, 12:52:17 »
Kristalove gule dosli a telepaticke spojenie tiez zrejme nefunguje, lebo vobec netusim, aku chybu to moze pisat.
Skus sem skopirovat cely program alebo minimalnu cast, ktora demonstruje ako to nefunguje a dodaj udaje o kompilatore a o systeme (hlavne 32/64 bit).
Mne to v gcc 4.6 (64bit) v Linuxe bezi uplne v pohode.

dzolo

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #3 kdy: 14. 04. 2012, 12:55:30 »
Vytvoř pole dynamicky pomocí jedné z *alloc funkcí.

ogar

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #4 kdy: 14. 04. 2012, 12:57:46 »
No, problem je v tom, kde to pole deklarujes:
a) pokud mimo nejakou funkci, pak se (pri spusteni programu) vytvori v datovem segmentu, a melo by to fungovat vice-mene bezproblemu (pokud ma stroj hodne pameti)
b) pokud ale uvnitr nejake funkce (i treba main()), pak se vytvori na stacku, a rekl bych, ze 4M kus stacku ti asi nekdo tezko povoli.

Pro b) by teoreticky pomohlo klicove slovo static, kdy pak tu promennou alokuje taky v datech, a dostavas se do a).

Podle mne je nejlepsi, si nadeklarovat pouze pointer long *, a teprve za behu programu si pres malloc(sizeof(long)*1000000) toto pole naalokovat - takto urcite nebude problem (pokud ovsem nebezis na nejakem 8-bit nebo 16-bit :-) No a na konci programu (nebo kdyz uz to pole nepottrebujes), tak free().


marwyn

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #5 kdy: 14. 04. 2012, 21:15:20 »
Tak linker by na to měl mít option. Třeba ms linker má stack reserve size default na 1MB.

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #6 kdy: 14. 04. 2012, 22:48:22 »
vdaka ogar, ked som to definoval ako "static long pole[1000000]" tak to uz fungovalo. A dakujem aj ostatnym za rady.

bu

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #7 kdy: 14. 04. 2012, 23:30:07 »
vdaka ogar, ked som to definoval ako "static long pole[1000000]" tak to uz fungovalo. A dakujem aj ostatnym za rady.

Doufam, ze tusis, co delas. Ta funkce pak nebude moc reentrantni...

Pali

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #8 kdy: 15. 04. 2012, 08:28:07 »
Tak linker by na to měl mít option. Třeba ms linker má stack reserve size default na 1MB.

Mam pocit ze nieco take linuxove elf binarky nepodporuju. Ak dobre viem, tak velkost stacku si binarka nemoze vynutit, ale musis ju nastavit v ulimits.

Prave som aj pozrel manpage pre ld a tam sa pre moznost rezervovania velkosti stacku (option --stack) pise: [This option is specific to the i386 PE targeted port of the linker]

Sten

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #9 kdy: 16. 04. 2012, 15:46:53 »
Mam pocit ze nieco take linuxove elf binarky nepodporuju. Ak dobre viem, tak velkost stacku si binarka nemoze vynutit, ale musis ju nastavit v ulimits.

Prave som aj pozrel manpage pre ld a tam sa pre moznost rezervovania velkosti stacku (option --stack) pise: [This option is specific to the i386 PE targeted port of the linker]

Stack lze za běhu rozšířit pomocí mmap, ale nedoporučoval bych to dělat, pokud si opravdu nejste jistý, co a proč to děláte (použití pole o milionu prvků není dostatečný důvod).

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #10 kdy: 16. 04. 2012, 16:17:21 »
Mam pocit ze nieco take linuxove elf binarky nepodporuju. Ak dobre viem, tak velkost stacku si binarka nemoze vynutit, ale musis ju nastavit v ulimits.

Prave som aj pozrel manpage pre ld a tam sa pre moznost rezervovania velkosti stacku (option --stack) pise: [This option is specific to the i386 PE targeted port of the linker]

Stack lze za běhu rozšířit pomocí mmap, ale nedoporučoval bych to dělat, pokud si opravdu nejste jistý, co a proč to děláte (použití pole o milionu prvků není dostatečný důvod).

mmap pro stack?
To jsem teda nevěděl. Mrknul jsem se na nějaké many, něco tam o tom je, ale vidím tam věty jako "is currently a no-op", "if some architectures require special treatment", ...

Ty jsi to někdy takto použil?
(ptám se, protože mne to doopravdy zajímá)

Sten

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #11 kdy: 16. 04. 2012, 16:52:46 »
Mam pocit ze nieco take linuxove elf binarky nepodporuju. Ak dobre viem, tak velkost stacku si binarka nemoze vynutit, ale musis ju nastavit v ulimits.

Prave som aj pozrel manpage pre ld a tam sa pre moznost rezervovania velkosti stacku (option --stack) pise: [This option is specific to the i386 PE targeted port of the linker]

Stack lze za běhu rozšířit pomocí mmap, ale nedoporučoval bych to dělat, pokud si opravdu nejste jistý, co a proč to děláte (použití pole o milionu prvků není dostatečný důvod).

mmap pro stack?
To jsem teda nevěděl. Mrknul jsem se na nějaké many, něco tam o tom je, ale vidím tam věty jako "is currently a no-op", "if some architectures require special treatment", ...

Ty jsi to někdy takto použil?
(ptám se, protože mne to doopravdy zajímá)

Jj, použil jsem mmap + makecontext + swapcontext. Ten manuál říká, že na v současnosti podporovaných platformách není potřeba stack alokovat ve speciálních místech (proto MAP_STACK nedělá nic zvláštního), ale jsou připraveni na architektury, kde by to bylo potřeba.

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #12 kdy: 18. 04. 2012, 10:55:51 »

Stack lze za běhu rozšířit pomocí mmap, ale nedoporučoval bych to dělat, pokud si opravdu nejste jistý, co a proč to děláte (použití pole o milionu prvků není dostatečný důvod).

mmap pro stack?
To jsem teda nevěděl. Mrknul jsem se na nějaké many, něco tam o tom je, ale vidím tam věty jako "is currently a no-op", "if some architectures require special treatment", ...

Ty jsi to někdy takto použil?
(ptám se, protože mne to doopravdy zajímá)

Jj, použil jsem mmap + makecontext + swapcontext. Ten manuál říká, že na v současnosti podporovaných platformách není potřeba stack alokovat ve speciálních místech (proto MAP_STACK nedělá nic zvláštního), ale jsou připraveni na architektury, kde by to bylo potřeba.

No pěkně.
A mohu se zeptat, co přesně Tě (doufám, že Ti mohu tikat) k použití toho donutilo?
Není třeba rozebírat moc konkrétně, ale nějaký hrubý popis požadavků, které k tomu vedly.
Díky moc!

Sten

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #13 kdy: 18. 04. 2012, 11:30:32 »

Stack lze za běhu rozšířit pomocí mmap, ale nedoporučoval bych to dělat, pokud si opravdu nejste jistý, co a proč to děláte (použití pole o milionu prvků není dostatečný důvod).

mmap pro stack?
To jsem teda nevěděl. Mrknul jsem se na nějaké many, něco tam o tom je, ale vidím tam věty jako "is currently a no-op", "if some architectures require special treatment", ...

Ty jsi to někdy takto použil?
(ptám se, protože mne to doopravdy zajímá)

Jj, použil jsem mmap + makecontext + swapcontext. Ten manuál říká, že na v současnosti podporovaných platformách není potřeba stack alokovat ve speciálních místech (proto MAP_STACK nedělá nic zvláštního), ale jsou připraveni na architektury, kde by to bylo potřeba.

No pěkně.
A mohu se zeptat, co přesně Tě (doufám, že Ti mohu tikat) k použití toho donutilo?
Není třeba rozebírat moc konkrétně, ale nějaký hrubý popis požadavků, které k tomu vedly.
Díky moc!

Původně mi o zvětšování stacku nešlo, to jsem zjistil jenom tak vedle, šlo o to najít řešení pro předávání dat mezi dvěma řídícími objekty ze dvou knihoven mimo moji kontrolu, kde jeden čekal a periodicky volal metodu read, když chtěl data, a druhý čekal a periodicky volal metodu write, když měl data k dispozici. V metodách read a write se vždycky přehodil kontext do té druhé a tak se ta data předávala.

Re:Maximalna velkost jednorozmerneho pola v jazyku C
« Odpověď #14 kdy: 18. 04. 2012, 12:57:31 »
...
Původně mi o zvětšování stacku nešlo, to jsem zjistil jenom tak vedle, šlo o to najít řešení pro předávání dat mezi dvěma řídícími objekty ze dvou knihoven mimo moji kontrolu, kde jeden čekal a periodicky volal metodu read, když chtěl data, a druhý čekal a periodicky volal metodu write, když měl data k dispozici. V metodách read a write se vždycky přehodil kontext do té druhé a tak se ta data předávala.
Aha, díky.
PS: použití shared memory bylo diskvalifikování tím "předávání dat mezi dvěma řídícími objekty ze dvou knihoven mimo moji kontrolu"?