Fórumok
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ások
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.
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$%#$#%^*^"
Próbáltad már a
bbcode-ot? Így lehet
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 < es > 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?