Forum: PC-Programmierung C Speicher >1Gb


von A.Wallner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo.

Ich möchte in meinem Programm mehr als 1Gb RAM Speichern.

Folgendes:
1
#define STORAGE 1073741824LLU
2
static char example1[STORAGE];
3
static char example2[STORAGE];
4
static char example3[STORAGE];

Bringt oben angehängte Fehlermeldung beim Ausführen. Auch mit 
Administrator Rechten.

Mit calloc / malloc zeigt der zweite Zeiger auf Null und kann ebenfalls 
nicht Reserviert werden.
1
#define STORAGE 1073741824LLU
2
char *example1;
3
char *example2;
4
char *example3;
5
  example1 = (char*)calloc(STORAGE, sizeof(char));
6
  if(example1 == NULL) { printf("Storage1 failure\r\n"); return 0; }
7
  example2 = (char*)calloc(STORAGE, sizeof(char));
8
  if(example2 == NULL) { printf("Storage2 failure\r\n"); return 0; }
9
  example3 = (char*)malloc(sizeof(char) * STORAGE);
10
  if(example3 == NULL) { printf("Storage3 failure\r\n"); return 0; }

Also 1Gb kann ich immer Reservieren. Bei mehr, funktioniert das Programm 
nicht mehr.
Ich benutze GCC von mingw mit der Compiler Option
1
gcc client.c -o client.exe -march=x86-64

Selbst bei 32bit sollte ich bis zu 4Gb erhalten können, warum 
funktioniert das ganze nicht?
Das ganze ist nur eine Spielerei - für den Fall man könnte sowas 
wirklich mal brauchen..

Mein System basiert auf Windows 10, 32Gb RAM, i7-8850H.

Vielen dank

mfg
Awallner

von geschnittenOderAmStück? (Gast)


Lesenswert?

Wenn Du Deine Arrays auf diese Weise definierst, dann muss der Speicher 
an einem Stück reserviert werden. Also in dem Fall 3 x 1GB am Stück.

Auch Deine malloc-Variante bringt Dich hier nicht weiter.

Bedenke außerdem:
Jeder Pointer auf ein 8 Bit char belegt selber auch 32 Bit.

Den Speicherverbrauch musst Du auf andere Weise hochtreiben. Zum 
Beispiel mit structs, die dann  ein paar KB groß sind anstelle eines 
char, was nur 8 Bit groß ist.

von Florian S. (vatterger)


Lesenswert?

Du allozierst auch knapp über 3Gbyte. 2Gbyte sind das Limit auf älteren 
32-bit Betriebssystemen -> https://en.wikipedia.org/wiki/2_GB_limit

von Dirk B. (dirkb2)


Lesenswert?

Die Stackgröße ist begrenzt und deutlich kleiner als das RAM.
Da kannst du kein GByte Speicher nutzen.

von Dirk B. (dirkb2)


Lesenswert?

A.Wallner schrieb:
> Selbst bei 32bit sollte ich bis zu 4Gb erhalten können, warum
> funktioniert das ganze nicht?

Weil das Programm die 4GB noch mit dem Betriebssystem teilt.
Windows erlaubt 2 GByte.
Du kannst aber - mit magischen Optionen - auch 3 GB nutzen.

von g457 (Gast)


Lesenswert?

> Selbst bei 32bit sollte ich bis zu 4Gb erhalten können, warum
> funktioniert das ganze nicht?

Nein, auf 32bit-Windoofs bekommst Du standardmäßig nur (insgesamt) 2GB. 
Mit Bootoptionen kann man das bei manchen Varianten auf 3GB erweitern. 
Zumindest war das bisher so. Der Rest des Adressraums gehört dem System.

Auf Linux/amd64 läuft der Codeteil übrigens wie erwartet (nämlich so wie 
er dasteht korrekt - abgesehen vom Speicherleck). Die Vermutung liegt 
nahe, dass Du für win32 compilierst, überprüf das mal.

HTH

von A.Wallner (Gast)


Lesenswert?

Florian S. schrieb:
> Du allozierst auch knapp über 3Gbyte. 2Gbyte sind das Limit auf älteren
> 32-bit Betriebssystemen -> https://en.wikipedia.org/wiki/2_GB_limit

Du haßt recht.. Der Test mit 1,5Gb hat geklappt.. Wobei mein System 
nicht alt ist und vor allem nicht 32bit. Folglich ist mein Programm nur 
auf 32bit Kompiliert.

geschnittenOderAmStück? schrieb:
> Den Speicherverbrauch musst Du auf andere Weise hochtreiben. Zum
> Beispiel mit structs, die dann  ein paar KB groß sind anstelle eines
> char, was nur 8 Bit groß ist.

Probiere ich mal aus, danke.

Dirk B. schrieb:
> Die Stackgröße ist begrenzt und deutlich kleiner als das RAM.
> Da kannst du kein GByte Speicher nutzen.

Im meinem Beispiel gibt der Heap über 1Gb her. Vermutlich max. 2Gb wie 
Florian schrieb.

@g457
Danke ich überprüfe das mal.

mfg
Awallner

von A.Wallner (Gast)


Angehängte Dateien:

Lesenswert?

Übersetzt war das Programm für i686. Deswegen kam ich nie über 2Gb.

Nun geht es ohne Probleme. Zumindest habe ich es nur mit malloc probiert 
aber das reicht auch.

danke für die Hilfe und Erklärung.

mfg
Awallner

von Rolf M. (rmagnus)


Lesenswert?

A.Wallner schrieb:
> Ich benutze GCC von mingw mit der Compiler Option
>gcc client.c -o client.exe -march=x86-64

Die richtige Option wäre übrigens -m64, müsste bei einem 64-Bit-Compiler 
dann aber auch Default sein.

von Dirk B. (dirkb2)


Lesenswert?

A.Wallner schrieb:
> Dirk B. schrieb:
>> Die Stackgröße ist begrenzt und deutlich kleiner als das RAM.
>> Da kannst du kein GByte Speicher nutzen.
>
> Im meinem Beispiel gibt der Heap über 1Gb her. Vermutlich max. 2Gb wie

Dir ist der Unter§chied zwischen Stack und Heap bekannt?
Auch wann Stack oder Heap benutzt wird?

Der Stack ist i.A. kleiner als ein GByte.

von Roger S. (edge)


Lesenswert?

Dirk B. schrieb:
> A.Wallner schrieb:
>> Selbst bei 32bit sollte ich bis zu 4Gb erhalten können, warum
>> funktioniert das ganze nicht?
>
> Weil das Programm die 4GB noch mit dem Betriebssystem teilt.
> Windows erlaubt 2 GByte.
> Du kannst aber - mit magischen Optionen - auch 3 GB nutzen.

Das ist aber nur fuer Windows selbst, das Program muss nicht teilen.
Damit ein 32bit Programm auf einem 64bit Windows seine ganzen 4GB nutzen 
kann (3GB bei 32bit Windows entsprechend konfiguriert)  muss das 
IMAGE_FILE_LARGE_ADDRESS_AWARE in seinem image header gesetzt haben.

Cheers, Roger

von A.Wallner (Gast)


Lesenswert?

Dirk B. schrieb:
> Dir ist der Unter§chied zwischen Stack und Heap bekannt?
> Auch wann Stack oder Heap benutzt wird?
>
> Der Stack ist i.A. kleiner als ein GByte.

A.Wallner schrieb:
> Im meinem Beispiel gibt der Heap über 1Gb her. Vermutlich max. 2Gb wie
> Florian schrieb.

Wie gesagt. Der Stack Interessiert mich dabei nicht.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Dirk B. schrieb:
> A.Wallner schrieb:
>> Dirk B. schrieb:
>>> Die Stackgröße ist begrenzt und deutlich kleiner als das RAM.
>>> Da kannst du kein GByte Speicher nutzen.
>>
>> Im meinem Beispiel gibt der Heap über 1Gb her. Vermutlich max. 2Gb wie
>
> Dir ist der Unter§chied zwischen Stack und Heap bekannt?
> Auch wann Stack oder Heap benutzt wird?

In den Beispielen des TE werden nur wenige Bytes vom Stack genutzt,
weswegen diese Fragen irrelevant sind.

von S. R. (svenska)


Lesenswert?

A.Wallner schrieb:
> Selbst bei 32bit sollte ich bis zu 4Gb erhalten können, warum
> funktioniert das ganze nicht?

Der Adressraum von Windows sollte um die 2 GB-Grenze eigentlich ein Loch 
haben, welches für Programme nicht zur Verfügung steht. Vielleicht ist 
das seit Windows 7 nicht mehr so. Auf einem 64 Bit-Host dürfte das 
eigentlich auch kein Problem mehr sein.

Das macht es schwierig, 2 GB am Stück zu alloziieren, selbst wenn man 
Windows im 3 GB-Modus bootet und konfiguriert hat. Zumal auf einem 32 
Bit-Host von den 4 GB RAM (sofern vorhanden) auf vielen Systemen ein 
Großteil sowieso nicht nutzbar ist, weil da das PCI-Aperture (VRAM und 
so) sein Scheibchen will.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.