title image


Smiley Re: Wieviel Bytes nimmt Integer-Variablen?
Die Frage, ob Visual Basic den Schritt von 16 nach 32 Bit mitgemacht hat, stellt sich in dieser Form nicht, denn die Bedeutung des C++ Schlüsselwortes "int" entspricht nicht dem VB - Schlüsselwort "Integer".C und C++ kennen u.a. die Variablentypen "short" (oder "short int"), "long" (oder "long int") oder eben nur "int".Dabei entspricht "short int" dem Visual Basic Typ Integer und "long int" dem VB Typ Long.Mit "int" (ohne "short" oder "long") ist immer ein ganzes Wort gemeint, das bei Win3.1 eben aus 16 Bits, bei Win95 aus 32 Bits und bei einigen Microcontrollern aus 8 Bits besteht.Wenn es in naher Zukunft einmal ein 64-Bit Betriebssystem gibt, wird "int" wahrscheinlich ein 64 Bit breites Wort bezeichnen.Unter Visual Basic ist zu erwarten, daß Long bei Funktionsaufrufen unter bestimmten Bedingungen eine höhere Performance bietet. Dazu betrachte man folgende Funktion:Function MachEtwas (ByVal Parm1 as Long, ByVal Parm2 as Long)Wenn diese Funktion aufgerufen wird, werden die beiden Long-Parameter Wort für Wort (ein Wort = 32 Bit) auf den Stack kopiert, was sehr schnell funktioniert. Hätte man statt dessen geschrieben:Function MachEtwas (ByVal Parm1 as Integer, ByVal Parm2 as Integer)dann würden die beiden Integer-Werte in ein Wort "zusammengepfercht", so daß ein Parameter die Bits 0 bis 15 und der zweite die Bits 16 bis 31 belegt. Damit der zweite Parameter in die obere Worthälfte passt, müssen die Bits vorher um 16 Stellen nach links geschoben werden und dann bitweise mit dem ersten Parameter ODER - verknüpft werden.Auch, wenn der Prozessor für derartige Operationen eigene Befehle bietet, (Shift Left, Oder-Verknüfung), belibt festzuhalten, daß hier mehr zu tun ist als bei reinen Long-Parametern.Die hier beschriebenen Abweichungen treten jedoch nur auf, wenn die Parameter Paarweise(!) als Integer(!) und ByVal(!) übergeben werden. Wenn man also schreibt:Function MachEtwas (ByVal Parm1 as Integer, ByVal Parm2 as Long, ByVal Parm3 as Integer)Dann belegt Parm1 die untere Hälfte des ersten Wortes, während die obere Hälfte ungenutzt bleibt, weil Parm2 ein ganzes Wort benötigt, so daß Parm3 dann in die untere Hälfte eines dritten Wortes geschrieben wird. Und noch ein Beispiel:Function MachEtwas (Parm1 as Integer, Parm2 as Integer)Diese Funktion ist genau so schnell wieFunction MachEtwas (Parm1 as Long, Parm2 as Long)denn beide Funktionen übergeben ihre Parameter nun nicht ByVal, sondern (implizit) ByRef, so daß eben nicht zwei Integer-Werte, sondern die 32-Bit Adressen ("Zeiger") der beiden Variablen übergeben werden, so daß in beiden Fällen zwei ganze Worte benötigt werden.Gruß,Thomas Prötzschcu
Thomas Prötzsch

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: