nagy tömb deklarálás

 ( kaltsi | 2008. április 9., szerda - 10:41 )

A kérdésem az igazán csak elméleti, mert ugyebár allokálni sokkal szebb neki memóriát, de a kérdésem mégis az lenne, mekkora maximális méretű tömb deklarálható?
Vagy milyen fordítási kapcsolóval lehet 64k-nál nagyobb tömböt csinálni?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Szia!

Ha nem kell minden tömbelemnek rögtön értéket adni, érdemes lehet láncolt listával helyettesíteni, így egy csomó memória spórolható.

Arra gondolsz, hogy lokálisan a stacken akarsz tömböt deklarálni?
Szerintem nincs 64k-s limit.

Kipróbál? Símán lehet 64K-nál nagyobb tömböt deklarálni.

#include <stdio.h>
int main()
{
    char buf[0x100000000];
    buf[0x100000000-1]='x';
    printf("sizeof 0x%lx\n",sizeof(buf));
    return 0;
}

Ez pl. símán lefut. Persze gondja lesz az os-nek, ha a program a tömböt elkezdi igazából használni.
--
CCC3

Egy ilyet raktam gyorsan össze, de ezt nem szereti :(

#include fcntl.h //kacsacsőröket nem tudtam megjeleníteni
#include sys/types.h
#include sys/uio.h
#include unistd.h
#include string.h
#include stdio.h

struct entry{
char name[22];
char value[22];
};

#define MERET_R 1000000

int main(int argc, char *argv[]){

char line[8192];
struct entry roamers[MERET_R];

printf("azdmeg\n");
}

Simán lefordul, de Segmentation fault-al fut

Hát, 40MB nem 64K ...

figyelembe kell venni, hogy a stacknek is van egy "limitje" threadenként (a linuxomon asszem 16 mega a default). Az ilyeneket vagy dinamikusan hozd létre, vagy mint globális változó.

"Az ilyeneket vagy dinamikusan hozd létre, vagy mint globális változó."

Talan lehet statikus is.
_________________________________________________________________________
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

Idézet:
kacsacsőröket nem tudtam megjeleníteni

Próbáltad már a [code] bbcode-ot? Így lehet <ilyeneket> is írni.

Mint már rámutattak, a stack default mérete kicsi. Ilyen esetben az ulimit -s környékén kellene keresgetni. Megjegyzem, ez nem kicsit gányolás így.

Ha mar nem hasznalod a [code] taget, akkor &lt; es &gt; a < es > karakterek.

Ilyet nem csinalunk, semmilyen korulmenyek kozott. Ez bad coding, IMO. Miert is nemjo, ha dinamikusan malloc()-olsz, vagy new-elsz neki memoriat?

Bar nyilvan nem szempont, de en Amigan iszonyatos mennyisegut anyaztam ilyesmi miatt, mert portolaskor kulonosen gyakran fut bele az ember a quality FOSS alkalmazasokban ilyen kodba, hogy stackbe foglal nehany 100k-s tempbuffereket (es az meg a jo eset, ha csak annyit), aztan nekiall rekurzivan hivni. Holy shit. Es itt alapbol 4k a stack merete. De 64k-nal tobbet meg a webbongeszo sem hasznal...

-=- Mire a programozó: "Na és szerintetek ki csinálta a káoszt?" -=-

db2.c: In function ‘main’:
db2.c:4: warning: integer constant is too large for ‘long’ type
db2.c:4: error: size of array ‘buf’ is too large
db2.c:5: warning: integer constant is too large for ‘long’ type
db2.c:4: warning: unused variable ‘buf’

64-bites Linuxon, gcc 4.1.2-vel fordítottam. Más rendszereken másképp lehet. Annyi mindenesetre látszik, hogy irreálisan nagy (a fizikai memóriánál nagyobb) tömböket is hajlandó létrehozni. Az os memóriakezelése nyilvántartja, hogy a nagy memóriablokk melyik része van benn ténylegesen a fizikai memóriában, melyik része változott, mit kell kirakni a swapra, valahogy így képzelem. Komplikált ügy.
--
CCC3

A 64k-s limit csak dos alatt volt valós módban.
Ilyennel max Turbo C 3.0-ban találkozhatsz. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Oprendszerfüggő, de az alapelvek kb ezek:

Amit programblokkban deklarálsz, az a stacken jön létre.
Ezt a szálankénti stack mérete korlátozza, ami oprendszer szintű beállítás. Szerintem a stacket nem szokás dinamikusan továbbfoglalni ha elfogy. Pedig elvileg akár lehetne is. Tehát itt egy fix limit van.

Amit a függvények között statatikusan, az már induláskor egy statikus memóriaterületen. Itt szerintem az oprendszer virtuális memóriája és persze a címzési modell a korlát. Egy mai rendszeren itt foglalhatsz 4GB-ig szerintem.

Dinamikus foglalásnál szintén akármennyit foglalhatsz. Sőt az oprendszer akár csinálhat neked olyat is, hogy ha a közepét nem használod a tömbnek, akkor ahhoz nem rendel memórialapot, csak on-demand.

Mit akarsz vele csinálni?