Forum: Compiler & IDEs uint64_t verwendet und gleich wird 5kb mehr Ram gebraucht


von Nik Bamert (Gast)


Lesenswert?

Hi,

tschuldigung, ich muss euch schon wider mit einer warscheinlich
einfachen Frage nerven. Also ich fasse mich kurz. Ich hab hier eine
hübsche Funktion geschrieben um mit Fat32 von einer Sd Karte zu lesen.
Dabei hab ich mir das so zurecht gelegt, dass ich von jedem beliebigen
Byte in der Datei anfangen zu lesen kann.

Nun desshalb kann die Variable 'start', natürlich sehr gross werden.
(Start gibt das byte an von welchenm gelesen werden soll). Nun habe ich
bis anhin uint32_t verwendet; das klappt bis 32768 auch ganz gut. Nur
wenn ich daraus nun einen uint64_t mache, dann steigt die Codegrösse
von ~4000 bytes auf über 9000 bytes an. Und dies 'bloss',  4
folgenden Rechnungen. Als optimierungslevel beim compilieren verwende
ich 's'.

Was ich auch nicht ganz begreife - ein uint32_t ist in inttypes ja als
unsigned long long definiert. sollte also 32bits lang sein.
Wenn der unsigned ist sollte das ja bedeuten 2^32 = 4294957296
Bei mir gibts allerdings schon ab 32768 Rechnungsfehler.
(multiplikationen verwende ich allerdings nirgends).

Nik

von Stefan M. (Gast)


Lesenswert?

Wenn du konstanten im Code eingibst, solltest du auf jeden Fall immer
die richtigen Postfixe verwenden, sprich z.b. "a = 40000ULL", wenn
die Zahl als unsigned long long gerechet werden soll.

Je nach Rechenoperation kann eine 64bit Rechnung extrem viel mehr Platz
brauchen als eine 32bit Rechnung. Du arbeitest ja schließlich immerhin
mit einem 8bit Kern.

Poste mal deinen Code, manchmal lässt sich bei den Rechnungen was von
Hand optimieren, so dass es schneller zu rechnen geht.

von Nik Bamert (Gast)


Lesenswert?

oh sch***** im Titel sollte es natürlich heissen 5kb mehr Flash, nicht
Ram.

Das mit den Postfixen werd ich gleich mal versuchen, ich hab nämlich
eine Konstante, wenn das noch nicht hin haut poste ich mal den Code :)

von Nik Bamert (Gast)


Angehängte Dateien:

Lesenswert?

So ich hab die funktion + Aufruf mal angehängt.

Es könnte auch an meiner Art liegen, wie ich die Zahl berechne(oberster
abschnitt in fread)

Ich müsste irgendwie das abgerundete Ergebniss von start/512 kriegen,
wenn möglich mit einem shift oder so was in der Art? Irgendwie muss es
doch effektiver gehen und ohne dass endlose Zahlen entstehen.

von Stefan M. (Gast)


Lesenswert?

Du solltest dieses "start/512" nur einmal am Anfang der Funktion
berechnen. Außerdem spart "start >> 9" im vergleich zu "start/512"
Speicherplatz, habs grad mal getestet.

von Benedikt (Gast)


Lesenswert?

Das mit dem long long ist mir auch schonmal aufgefallen.
5kByte für eine einfache long long Division ist schon extrem.
In Assembler ist da kein unterschied: Man muss nur den Schleifenzähler
anpassen, so dass er 64 statt 32bits verarbeitet.
Da es bei mir nicht auf absolute Genauigkeit ankam, habe ich float
verwendet.

Eigentlich sollte zwischen start>>9 und start/512 kein Unterschied
sein, wenn es unsigned ist: Der Compiler macht aus beiden shifts.
Wenn es signed ist, dann gilt start>>9 != start/512 !
Aus diesem Grund ist es eigentlich immer sichere, wenn man teilt.

von Christian Spahn (Gast)


Lesenswert?

Welche Werte hat denn sectors_per_cluster so? Wenn es sich nämlich um
2er Potenzen handelt (4, 8, 16...) würde ich es nämlich auch so
speichern.

Zum einen kommt man dann evtl. mit einer kleineren Variablen aus, zum
anderen kann man die teuren Divisionen durch billige Shifts ersetzen.

von Walter (Gast)


Lesenswert?

wie Du schon oben bemerkt hast kann mit mit 32 Bit sehr viel mehr als
32768 speichern/rechnen.
Ich denke der Fehler liegt woanders, ich würde in so einem Fall
versuchen den Code zu debuggen und dabei die Berechnungen
kontrollieren.

Grüße
Walter

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.