Seite 1 von 2

64 Bit

Verfasst: 21.07.2011 00:45
von purebas
Hat jemand schon Erfahrungen mit 64 Bit Programme gemacht? Was muss man generell beachten, wenn ich PureBasic nutze, um 64 Bit Programm zu erzeugen, der Quellcode jedoch auch möglichst als 32 Bit compilierbar sein sollte?

Re: 64 Bit

Verfasst: 21.07.2011 09:11
von Vermilion
Eigentlich gibt es keinen großen Unterschied. Zumindest nicht spürbar, bei mir. Auf eines solltest du schon achten, damit du 64 Bit überhaupt ausnutzt:

Früher war der Standardtyp für Variablen "long", heute ist es "Integer". Long ist immer 4 Byte groß, Integer nur in 32 Bit Programmen, da er in 64 Bit Programmen 8 Byte groß ist.

Es kommt auf deinen Stil an, ob du auch die Variablen, die den Standardtyp benutzen, immer explizit deklarierst (mit Typensuffix á la "Variable.i") oder du das einfach weg lässt, wie ich. In letztem Fall brauchst du dir keinen Kopf machen. Ansonsten solltest du die Long Variablen auf Integer ändern. Aber selbst ohne das sollte es kompilierbar sein. Wie gesagt, eigentlich gibt es im Normalfall keine wahrnehmbaren Unterschiede und beides ist zueinander kompatibel (vom Quelltext her).

Re: 64 Bit

Verfasst: 21.07.2011 15:00
von NicTheQuick
Wichtig ist vor allem, dass Pointer auch in Pointer-Variablen gespeichert werden, also '*pointer', und IDs, die du z.B. durch #PB_ANY bekommst entweder auch als Pointer oder als Integer gespeichert werden. Diese Werte können nämlich 32 Bit überschreiten auf einem 64-Bit-System. Und dafür passen sich die Integer ja an.

Re: 64 Bit

Verfasst: 21.07.2011 15:56
von ts-soft
Häufigster Fehler sind auch unangepasste Strukturen! Wenn es also knallt oder schei** spielt, Strukturen überprüfen,
ob die auch für FASTCALL optimiert (geboundet) sind.

Re: 64 Bit

Verfasst: 21.07.2011 20:20
von purebas
Danke für die Antworten!

@ts-soft: Was meinst Du mit "FASTCALL optimiert (geboundet)"?

Ich bin nur ein mittelmäßiger Programmierer. FASTCALL sagt mir was. Aber was bedeutet in diesem Fall "geboundet"?

Re: 64 Bit

Verfasst: 21.07.2011 20:30
von ts-soft
hier: http://www.purebasic.fr/german/viewtopi ... 44#p293544
siehste Du eine Strukture mit "Alignment". Die Member der Structure werden immer auf 64-bit aufgefüllt, was die
Geschwindigkeit erhöht. Der C-Compiler führt im FASTCALL Modus diese Optimierung immer durch, wodurch die
Strukturen dann angepaßt werden müssen.

Verschwendet Platz ist aber schneller. Platz ist eigentlich immer genug da, weshalb sowas wie:
Procedure.b bla() normallerweise keinen Sinn macht, genauso wenig wie das man für true/false
ergebnisse Bytes verwendet. Besser ist immer Integer zu nutzen!

Re: 64 Bit

Verfasst: 21.07.2011 21:58
von ullmann
@ts-soft: Ich sehe in dieser Strukture PB_Alignment1.b[4] und PB_Alignment2.b[4]. Sind das die Platzhalter für die 64-Bit-Ausrichtung?
Warum stehen die nicht beisammen oder zusammengefasst als PB_Alignment.b[8]? Wäre die Zusammenfassung zu PB-Alignment.b[8]
möglich? Wieso C-Compiler? Richtet der PB-Compiler die Strukture ebenfalls automatisch an einer 64-Bit-Adresse aus? Wenn nicht, wer
oder was übernimmt die Ausrichtung? Bei Programmen für PB 64 Bit: Müssen die Strukturen zwingend so geboundet werden oder ist das
optional? Ist FASTCALL unter 64 Bit zwingend oder optional?

Danke im Voraus für ein paar anfängerfreundliche Antworten. :)

Re: 64 Bit

Verfasst: 21.07.2011 22:49
von ts-soft
ullmann hat geschrieben:@ts-soft: Ich sehe in dieser Strukture PB_Alignment1.b[4] und PB_Alignment2.b[4]. Sind das die Platzhalter für die 64-Bit-Ausrichtung?
Genau
ullmann hat geschrieben: Warum stehen die nicht beisammen oder zusammengefasst als PB_Alignment.b[8]? Wäre die Zusammenfassung zu PB-Alignment.b[8]
Nein, dann ergeben sich im Speicher ja Kombinationen, die nicht auf einmal in ein 64-Bit Register passen, welches nunmal das schnellste wäre.
ullmann hat geschrieben:Wieso C-Compiler? Richtet der PB-Compiler die Strukture ebenfalls automatisch an einer 64-Bit-Adresse aus? Wenn nicht, wer
oder was übernimmt die Ausrichtung? Bei Programmen für PB 64 Bit: Müssen die Strukturen zwingend so geboundet werden oder ist das
optional? Ist FASTCALL unter 64 Bit zwingend oder optional?

Danke im Voraus für ein paar anfängerfreundliche Antworten. :)
Der PB Compiler optimiert keine Strukturen.
API-Strukturen sind nunmal in C oder C++ geschrieben. FASTCALL ist die zur Zeit einzig
genutzte CallConvention unter x64, jedenfalls weder Windows noch Linux nutzen etwas anderes.
Warum sollte man das durcheinander von stdcall und cdecl auch aufrecht erhalten?

Alle Angaben ohne Gewehr.

Gruß

Thomas

Re: 64 Bit

Verfasst: 21.07.2011 23:02
von ullmann
Yup, vielen Dank für die Erläuterungen.

Gruß Rainer

Re: 64 Bit

Verfasst: 21.07.2011 23:26
von purebas
:allright:

Sollte eine Schleifenvariable aus Geschwindigkeitsgründen auch als 64-Bit deklariert werden - auch wenn nur von 1 bis 1 Mio. gezählt wird? Das würde also bedeuten, dass ich alle Schleifenvariablen und überhaupt alle Gezahlvariablen auf Integer setzen sollte, damit die Ausführungsgeschwindigkeit optimiert ist.