64 Bit
64 Bit
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?
- Vermilion
- Beiträge: 1846
- Registriert: 08.04.2006 16:00
- Computerausstattung: Apple iMac (2010) & HP Notebook
- Wohnort: Heidekreis
Re: 64 Bit
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).
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).
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: 64 Bit
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.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: 64 Bit
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.
ob die auch für FASTCALL optimiert (geboundet) sind.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: 64 Bit
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"?
@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"?
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: 64 Bit
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!
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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: 64 Bit
@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.
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.

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: 64 Bit
Genauullmann 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?
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: Warum stehen die nicht beisammen oder zusammengefasst als PB_Alignment.b[8]? Wäre die Zusammenfassung zu PB-Alignment.b[8]
Der PB Compiler optimiert keine Strukturen.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.
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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: 64 Bit
Yup, vielen Dank für die Erläuterungen.
Gruß Rainer
Gruß Rainer
Re: 64 Bit

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.