64bit- OS byte, short, int oder long bzw. float oder double?

Hallo.
Ein 64bit- System adressiert ja immer 64bit, also 8 Speicherzellen auf einmal.
Heißt das in der Konsequenz nicht, dass der Ressourcenverbrauch von byte(8bit), short(16bit), int(32bit) und long(64bit) immer gleich, also immer eine Adresse mit 64bit ist und somit man eigentlich für alles immer gleich long/double nehmen könnte ohne auf einem 64bit System Performanceeinbußen zu bekommen?
 

XHelp

Top Contributor
Länge der Speicheradresse ist nicht das gleiche wie Länge des Inhaltes. Die Speicheradresse siehst du in Java eh nicht, von daher soll es dir da auch egal was wie wer was wann macht. Aber was du da in Klammern angibst ist eben die Länge des Inhaltes.
 
Länge der Speicheradresse ist nicht das gleiche wie Länge des Inhaltes. Die Speicheradresse siehst du in Java eh nicht, von daher soll es dir da auch egal was wie wer was wann macht. Aber was du da in Klammern angibst ist eben die Länge des Inhaltes.

Okay,
aber wenn ich in eine 64bit- Adresse einen 8bit großen Inhalt speichere, habe ich doch trotzdem 64bit verbraucht. Da liegt es doch nahe, gleich einen 64bit- Wert an der Adresse zu speichern.
 

Dekker

Bekanntes Mitglied
Okay,
aber wenn ich in eine 64bit- Adresse einen 8bit großen Inhalt speichere, habe ich doch trotzdem 64bit verbraucht. Da liegt es doch nahe, gleich einen 64bit- Wert an der Adresse zu speichern.

Nein. Stichwort Speicheroffset. Du kannst 64 Bit auch aufteilen und 16 x 8 Bit reinschreiben. Wie Java das genau intern macht weiß ich nicht, aber so verschwenderisch werden sie nicht mit dem speicher umgehen (zumindest hoffe ich das)...
 
Du kannst 64 Bit auch aufteilen und 16 x 8 Bit reinschreiben.

Huch, erklär mir mal wie das geht, da würde ich glaube ich viel Geld mit verdienen ;-)

Naja, okay wenn ich also 8x 8bit in eine 64bit Zelle reinschreibe, heißt das ja ich hole den Wert an dieser Speicherzelle raus, weil ich mir gemerkt habe, dass da noch meinetwegen 16bit frei sind, und hänge mir meine 8bit- Zahl hinten dran. Beim lesen hole ich mir wieder den Zelleninhalt, rufe ab, an welcher Stelle mein Wert steht, und splitte den Wert aus dem Zelleninhalt raus.
Ich muss mir also:
1. Merken, dass ich die Zelle in 8 Segmente unterteilt habe
2. Merken, in welchem Segment ich das Byte abgelegt habe.
Das sind 2 Operationen zusätzlich und außerdem noch mehr Speicherverbrauch. Ich bin mir immer noch nicht sicher, ob es nicht wirklich performanter ist, einfach gleich 64bit- Zahlen zu benutzen.

Edit: Nach langer Suche habe ich jetzt selbst eine Antwort gefunden. Demnach stimmt meine Vermutung.

http://www.javaschubla.de/2007/javaerst0060.html hat gesagt.:
Es lohnt sich normalerwiese nicht, um Speicherplatz zu sparen, byte, short oder float zu verwenden. Man benutzt eigentlich immer int, long und double, weil das schneller ist. Ein 32-Bit-Computer kann nun mal auf 32 Bit (4 Byte) am schnellsten zugreifen, nur Teile davon zu verwenden, verlängert die Zugriffszeit.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Mal angenommen du wohnst in "Bischöflich-Geistlicher-Rat-Josef-Zinnbauer-Straße" (die gibt es wirklich :joke: ). Wäre es sinnvoll zu sagen: "Och, die Adresse ist eh lang, also kann ich mir direkt eine Villa kaufen"?
WIE du die Sachen adressierst hat nichts damit zu tun, WAS bei diesen Adressen ist.
 
G

Guest2

Gast
Moin,

verlassen sollte man sich imho auf gar nichts:

http://java.sun.com/docs/books/jvms/first_edition/html/Overview.doc.html hat gesagt.:
3.4 Words
No mention has been made of the storage requirements for values of the various Java Virtual Machine types, only the ranges those values may take. The Java Virtual Machine does not mandate the size of its data types. Instead, the Java Virtual Machine defines an abstract notion of a word that has a platform-specific size. A word is large enough to hold a value of type byte, char, short, int, float, reference, or returnAddress, or to hold a native pointer. Two words are large enough to hold values of the larger types, long and double. Java's runtime data areas are all defined in terms of these abstract words.

A word is usually the size of a pointer on the host platform. On a 32-bit platform, a word is 32 bits, pointers are 32 bits, and longs and doubles naturally take up two words. A naive 64-bit implementation of the Java Virtual Machine may waste half of a word used to store a 32-bit datum, but may also be able to store all of a long or a double in one of the two words allotted to it.

The choice of a specific word size, although platform-specific, is made at the implementation level, not as part of the Java Virtual Machine's design. It is not visible outside the implementation or to code compiled for the Java Virtual Machine.

http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#15722 hat gesagt.:
3.6.1 Local Variables
Each frame (§3.6) contains an array of variables known as its local variables. The length of the local variable array of a frame is determined at compile time and supplied in the binary representation of a class or interface along with the code for the method associated with the frame (§4.7.3).

A single local variable can hold a value of type boolean, byte, char, short, int, float, reference, or returnAddress. A pair of local variables can hold a value of type long or double.

Local variables are addressed by indexing. The index of the first local variable is zero. An integer is be considered to be an index into the local variable array if and only if that integer is between zero and one less than the size of the local variable array.

A value of type long or type double occupies two consecutive local variables. Such a value may only be addressed using the lesser index. For example, a value of type double stored in the local variable array at index n actually occupies the local variables with indices n and n +1; however, the local variable at index n +1 cannot be loaded from. It can be stored into. However, doing so invalidates the contents of local variable n.

The Java virtual machine does not require n to be even. In intuitive terms, values of types double and long need not be 64-bit aligned in the local variables array. Implementors are free to decide the appropriate way to represent such values using the two local variables reserved for the value.

Viele Grüße,
Fancy
 
G

Gasd6462

Gast
Implementors are free to decide the appropriate way to represent such values using the two local variables reserved for the value

Lol, also wenn man einen gescheiten Implementierer hat, ist die Größe der Datentypen abhängig von der Wortbreite und wenn man Pech hat muss die CPU dauernd herum rechnen, wo sich jetzt welche Variable in welchem Speicherplatz verkrochen hat :-D.
 
G

Gast2

Gast
javaschubla.de hat gesagt.:
Es lohnt sich normalerwiese nicht, um Speicherplatz zu sparen, byte, short oder float zu verwenden. Man benutzt eigentlich immer int, long und double, weil das schneller ist. Ein 32-Bit-Computer kann nun mal auf 32 Bit (4 Byte) am schnellsten zugreifen, nur Teile davon zu verwenden, verlängert die Zugriffszeit.

ja klar ... was soll da länger dauern, wenn auf weniger als die maximale Bandbreite zuzugreifen :lol: ... sorry - aber das ist Mist ... es wird immer auf alle 32 Bit zugegriffen - was zuviel ist wird von der CPU einfach weg geschmissen ... mal abgesehen davon rechnet die CPU immer mit der gleichen Bitbreite - egal ob ich 2 Bytes addiere oder 2 Integer
 
G

Guest2

Gast
Wenn man in C programmiert, sollte man sich imho schon bewusst sein, das die Speichergröße einzelner Datentypen und insbesondere deren Anordnung im Speicher eben doch Einfluss auf den Gesamtspeicherverbrauch und das Laufzeitverhalten des Programms hat.

Ein scheinbar einfaches

Code:
struct Blub
{
    char a;
    short b;
    char c;
};

verhält sich eben komplett anders, als ein scheinbar ähnliches

Code:
struct Blub
{
    char a;
    char c;
    short b;
};

Die erste Variante ist dabei entweder langsamer oder größer.

Zum Einstieg z.B.: Data structure alignment


Aber, bei Java liegt soviel zwischen dem, was man tippt und dem, was letztendlich ausgeführt wird, dass man sich imho nicht nach so etwas richten sollte. Imho sollte man immer den Datentyp nehmen, der am besten für das Problem geeignet ist.

Auch die beiden von mir zitierten Stellen, legen nahe das innerhalb der JVM die Datentypen byte, char, short, int und float immer gleich behandelt werden. long und double aber immer zwei "Speicherstellen" belegen, unabhängig, ob diese gebraucht werden (32 Bit System) oder nicht (64Bit System). Was der JIT anschließend daraus macht, ist dabei dann aber noch weniger offensichtlich.

Viele Grüße,
Fancy
 
G

Gast2

Gast
Die erste Variante ist dabei entweder langsamer oder größer.
nein ... beide Varianten sind gleich schnell - beides sind 32 Bit ... das Einzige ist - so wie es bei Wikipedia beschreiben ist - das bei einer ungünstigen Ausrichtung 2x 4 Byte gelesen werden müssen ... das passiert aber bei modernen Compilern eben nicht mehr ... die entsprechende Option zur 4-Byte Ausrichtung ist Defaultmäßig aktiviert ... da werden eben entsprechende Dummy Bytes eingefügt um auf 4 zu kommen

Code:
char counter;
char sonstiges;
int value;

kann sein das dann im Speicher (bzw. Stack [sofern in einer Methode deklariert]) eine der beiden Varianten auftaucht

1 Byte counter - 1 Byte sonstiges - 2 Bytes nix - 4 Bytes value

oder eben (wohl eher)

4 Bytes value - 1 Byte counter - 1 Byte sonstiges

wenn die Variablen global definiert sind, dann kann es passieren das die Variablen mit anderen gemischt werden

1 Byte counter - 1 Byte sonstiges - 1 Byte irgendwas - 1 Byte nochwas - 4 Bytes value

wir sind aber in Java ... und ... was auch immer die JVM an der Stelle macht - das wird schon entsprechend schnell sein ... selbst bei aktuellen Rechnern kann uns das egal sein ... es ist genügend Speicher vorhanden, so das uns das nicht interessieren braucht ... anders ist es wenn man für einen Mirkoprozessor schreibt - dann ist das schon sehr interessant
 

Dekker

Bekanntes Mitglied
1 Byte counter - 1 Byte sonstiges - 2 Bytes nix - 4 Bytes value

oder eben (wohl eher)

4 Bytes value - 1 Byte counter - 1 Byte sonstiges

wenn die Variablen global definiert sind, dann kann es passieren das die Variablen mit anderen gemischt werden

1 Byte counter - 1 Byte sonstiges - 1 Byte irgendwas - 1 Byte nochwas - 4 Bytes value

wir sind aber in Java ... und ... was auch immer die JVM an der Stelle macht - das wird schon entsprechend schnell sein ... selbst bei aktuellen Rechnern kann uns das egal sein ... es ist genügend Speicher vorhanden, so das uns das nicht interessieren braucht ... anders ist es wenn man für einen Mirkoprozessor schreibt - dann ist das schon sehr interessant

Das war das was ich gemeint habe. Auch wenn ich vielleicht in Mathe besser aufgepasst haben sollte. Wie ich auf 16 * 8 = 64 kam werd ich wohl selbst nie verstehen :E
 
G

Guest2

Gast
nein ... beide Varianten sind gleich schnell - beides sind 32 Bit ... das Einzige ist - so wie es bei Wikipedia beschreiben ist - das bei einer ungünstigen Ausrichtung 2x 4 Byte gelesen werden müssen ... das passiert aber bei modernen Compilern eben nicht mehr ... die entsprechende Option zur 4-Byte Ausrichtung ist Defaultmäßig aktiviert ... da werden eben entsprechende Dummy Bytes eingefügt um auf 4 zu kommen

Genau und deswegen schrieb ich: "langsamer oder größer". Wenn das padding aktiviert ist, dann ist die Struktur größer, wenn nicht dann ist sie langsamer.

kann sein das dann im Speicher (bzw. Stack [sofern in einer Methode deklariert]) eine der beiden Varianten auftaucht

1 Byte counter - 1 Byte sonstiges - 2 Bytes nix - 4 Bytes value

oder eben (wohl eher)

4 Bytes value - 1 Byte counter - 1 Byte sonstiges

Nein. Bei einem struct verbieten es die einzelnen C/C++ Standards, dass die Reihenfolge geändert wird. Bei einem Methodenaufruf werden die calling conventions eingehalten (sofern die Methode nicht komplett wegoptimiert wird, "inline"). Lediglich bei lokalen "freien" Variablen darf der Compiler eingreifen.

Bei Java verhält sich der Compiler dabei ähnlich, die Reihenfolge von Variablen wird nicht geändert. (Der JIT hingegen kann dies möglicherweise?)


wir sind aber in Java ... und ... was auch immer die JVM an der Stelle macht - das wird schon entsprechend schnell sein ...

Ja, das ist in etwa das, was ich oben meinte als ich schrieb, dass man den Datentyp nehmen sollte, der am besten zum Problem passt.

Viele Grüße,
Fancy
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
G Heap Space erhöhen (64bit) Java Basics - Anfänger-Themen 45
E JDK installieren 64bit Linux - 32bit Java ? Java Basics - Anfänger-Themen 10
S .jar/java Datei ausführen Windows 7 64bit?! Java Basics - Anfänger-Themen 7
H JDK installieren 32bit oder 64bit? Java Basics - Anfänger-Themen 8
K kan 64Bit Version unter Win7Pro64 nicht installieren Java Basics - Anfänger-Themen 12
T Interpreter-Fehler Probleme beim .jar ausführen mit JRE 64bit Java Basics - Anfänger-Themen 9
J JDK installieren JRE unter Windows7 64bit Java Basics - Anfänger-Themen 8
F getProperty() unter 64bit Java Basics - Anfänger-Themen 2
H Long (64Bit) in 2 int (32Bit) zerlegen Java Basics - Anfänger-Themen 2
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
M Datentypen Byte, Float und Boolean Java Basics - Anfänger-Themen 13
F byte, short oder doch int? Java Basics - Anfänger-Themen 6
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
P int zu byte Java Basics - Anfänger-Themen 8
F Byte Array wachsen lassen Java Basics - Anfänger-Themen 5
M Java Klasse Byte Java Basics - Anfänger-Themen 10
F Byte Ausgabe plötzlich falsch Java Basics - Anfänger-Themen 0
V String in Byte umwandeln Java Basics - Anfänger-Themen 11
O Input/Output Ein (negatives) Byte über PrintWriter hinausschreiben Java Basics - Anfänger-Themen 3
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J byte - Ausgabe Java Basics - Anfänger-Themen 2
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
S byte to float Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
M Byte Array und Co. Java Basics - Anfänger-Themen 12
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
Y File to byte[] and byte[] to sysout Java Basics - Anfänger-Themen 3
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
T Erste Schritte Byte Java Basics - Anfänger-Themen 3
R byte[] zu String und Ausgabe Java Basics - Anfänger-Themen 2
H Variablen short <-> byte[] Java Basics - Anfänger-Themen 15
X Datentypen String in byte[] Java Basics - Anfänger-Themen 29
H Variablen 32bit Zählwert als Byte-Array Java Basics - Anfänger-Themen 9
H Variablen string nach byte Java Basics - Anfänger-Themen 12
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
S ArrayList<Byte> in String umwandeln Java Basics - Anfänger-Themen 5
V unsigned byte? Java Basics - Anfänger-Themen 27
M byte Array Mindestlänge Java Basics - Anfänger-Themen 19
U short[] nach byte[] Java Basics - Anfänger-Themen 11
D [jni] jbytearray <-> byte array Java Basics - Anfänger-Themen 8
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
S Input/Output String in byte umwandeln? Java Basics - Anfänger-Themen 5
F von Byte zu 2 Stellig Hex Java Basics - Anfänger-Themen 3
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
V Jar-Datei von Byte-Array oder Stream laden? Java Basics - Anfänger-Themen 9
G Binär in Byte speichern Java Basics - Anfänger-Themen 7
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
F Byte nach Zahl umwandeln Java Basics - Anfänger-Themen 11
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
T Datentypen unsigned byte? Java Basics - Anfänger-Themen 9
G Integar zu Byte Java Basics - Anfänger-Themen 4
P Byte mit 0...255? Java Basics - Anfänger-Themen 5
N Datentypen Fehler beim Umwandeln in byte Java Basics - Anfänger-Themen 3
L Umwandlung int <--> byte Java Basics - Anfänger-Themen 2
L Datentypen 250 und byte? Java Basics - Anfänger-Themen 4
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
H Datentypen Byte-Array RSA Java Basics - Anfänger-Themen 9
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
V Byte -> String -> Byte verlustfrei Java Basics - Anfänger-Themen 12
Hindi93 Byte to Int Java Basics - Anfänger-Themen 4
H Datentypen byte[] to int Java Basics - Anfänger-Themen 9
S hex zu byte Java Basics - Anfänger-Themen 4
M Byte Array: Werte größer 127? Java Basics - Anfänger-Themen 11
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5
H 1 Byte Status Variable Java Basics - Anfänger-Themen 3
P Datentypen Byte und char Typecast Java Basics - Anfänger-Themen 2
M Bit/Byte Operationen Java Java Basics - Anfänger-Themen 8
W Datentypen int -> byte Java Basics - Anfänger-Themen 2
H Datentypen Byte-Array aus Stream lesen Java Basics - Anfänger-Themen 3
F Typenumwandlung byte <=> int verstehen Java Basics - Anfänger-Themen 3
S Byte eines arrays Java Basics - Anfänger-Themen 17
N Frage zu Datentyp byte Java Basics - Anfänger-Themen 14
B unsigned byte Problem Java Basics - Anfänger-Themen 9
S 2 Byte Arrays addieren Java Basics - Anfänger-Themen 45
S Unbekannte Daten einlesen, speichern und in einem byte Array speichern Java Basics - Anfänger-Themen 3
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
H Frage zu Byte-Streams Java Basics - Anfänger-Themen 2
Z Wie Byte[] in einen String oder int konvertieren Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben