C -Register "Variable" in Purebasic ?
C -Register "Variable" in Purebasic ?
In C kann ich eine Variable mit Register definieren, der Compiler versucht dann, diese nicht auf dem Stack, sondern im Prozessorregister abzulegen.
Geht sowas auch mit PB ? Oder über einen Umweg Assembler ?
Geht sowas auch mit PB ? Oder über einen Umweg Assembler ?
Re: C -Register "Variable" in Purebasic ?
Gibts nicht. Aber "Register" ist eher veraltet in C. Die Compiler sollten mittlerweile intelligent genug sein, selbstständig dahingehend zu optimieren.
Grund ist vermutlich dass das Register aus Zeiten stammt, als die CPUs noch keine Cache-Speicher hatten. Würde mich nicht wundern, wenn die modernen Compiler das Steuerwort einfach ignorieren (was komplett erlaubt ist, Register ist nur ein Vorschlag für den Compiler).
edit:
in c++ 17 macht es exakt überhaupt nichts:
https://en.cppreference.com/w/cpp/keyword/register
Grund ist vermutlich dass das Register aus Zeiten stammt, als die CPUs noch keine Cache-Speicher hatten. Würde mich nicht wundern, wenn die modernen Compiler das Steuerwort einfach ignorieren (was komplett erlaubt ist, Register ist nur ein Vorschlag für den Compiler).
edit:
in c++ 17 macht es exakt überhaupt nichts:
https://en.cppreference.com/w/cpp/keyword/register
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Re: C -Register "Variable" in Purebasic ?
ah,ok.GPI hat geschrieben: ↑17.06.2021 19:28 Gibts nicht. Aber "Register" ist eher veraltet in C. Die Compiler sollten mittlerweile intelligent genug sein, selbstständig dahingehend zu optimieren.
Grund ist vermutlich dass das Register aus Zeiten stammt, als die CPUs noch keine Cache-Speicher hatten. Würde mich nicht wundern, wenn die modernen Compiler das Steuerwort einfach ignorieren (was komplett erlaubt ist, Register ist nur ein Vorschlag für den Compiler).
edit:
in c++ 17 macht es exakt überhaupt nichts:
https://en.cppreference.com/w/cpp/keyword/register
Ich muß zugeben, meine C-Literatur ist auch aus der Millenium-Zeit
Leicht veraltet, aber für die Grundlagen reicht es.
Re: C -Register "Variable" in Purebasic ?
Hab ein bischen noch rumgelesen. In C ist es wohl noch "aktuell" - aber eher wenn es um einfachere Microcontroller geht.
Man merkt halt, das C uralt ist. Aus einer Zeit stammt, in dem der Quellcode nicht komplett in Speicher war, weil man nur ein paar Kilobyte hatte.
Man merkt halt, das C uralt ist. Aus einer Zeit stammt, in dem der Quellcode nicht komplett in Speicher war, weil man nur ein paar Kilobyte hatte.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Re: C -Register "Variable" in Purebasic ?
Ja. das ist schon verrückt.Ich bin aus der C64-Zeit und dann der geliebte Amiga
Mann kann sich jetzt gar nicht mehr vorstellen, das der Arbeitsspeicher wirklich nur 64 kb groß war, und beim Amiga dann 512 MB.
Ich weiß noch, wie ich sehnsüchtig auf einer der ersten Festplatten mit 20 MB gestarrt habe.Beim Amiga konnte ich mir dann eine leisten, ich glaube 200 MB. Und heute hat man 128 GB - im HANDY
Ich bin im Moment hier im Forum dabei, mir von PB die Grundlagen bzg. Speicher,Pointer und dem ganzen "unter der Haube" anzueignen.
Insbesondere interessiert mich da die Geschwindigkeit, ich will meinen Code aus Prinzip möglichst effizient schreiben.
Bei der Geschwindigkeit heutiger Rechner und dem, was ich hobbymäßig machen werde, könnte ich mir das eigentlich sparen.
Ist ja eigentlich nur interessant, wenn man irgendwelche 3D-Engines schreibt oder riesige Datenbanken bewegt ect.
Gestern z.B habe ich mit ElapsedMilliSeconds eine For-Schleife gemessen, die einige Strings ausliest, und ca. ne halbe Stunde geärgert und den Fehler gesucht, weils nicht "funktioniert" und immer 0 angezeigt wird. Dann habe ich mal Delay 1000 eingegeben - und siehe da - als Ergebnis 1000.
Da ist mir dann mal aufgegangen, das ich meine Schleife vielleicht nicht For i=1 to 3 und nur 3 Strings auslesen sollte.
Warum kam da wohl 0 bei raus ?
Oh man
Aber nochmal zu Register: das hätte ja schon Sinn, Variablen im Register sind ja viel schneller ansprechbar. Könnte man nicht in PB eine Variable definieren, diese per ASM ins Register verschieben ? Wenn ich dann weiter in PB programmiere, benutzt er die Variablen dann nicht per Register ?
Mann kann sich jetzt gar nicht mehr vorstellen, das der Arbeitsspeicher wirklich nur 64 kb groß war, und beim Amiga dann 512 MB.
Ich weiß noch, wie ich sehnsüchtig auf einer der ersten Festplatten mit 20 MB gestarrt habe.Beim Amiga konnte ich mir dann eine leisten, ich glaube 200 MB. Und heute hat man 128 GB - im HANDY
Ich bin im Moment hier im Forum dabei, mir von PB die Grundlagen bzg. Speicher,Pointer und dem ganzen "unter der Haube" anzueignen.
Insbesondere interessiert mich da die Geschwindigkeit, ich will meinen Code aus Prinzip möglichst effizient schreiben.
Bei der Geschwindigkeit heutiger Rechner und dem, was ich hobbymäßig machen werde, könnte ich mir das eigentlich sparen.
Ist ja eigentlich nur interessant, wenn man irgendwelche 3D-Engines schreibt oder riesige Datenbanken bewegt ect.
Gestern z.B habe ich mit ElapsedMilliSeconds eine For-Schleife gemessen, die einige Strings ausliest, und ca. ne halbe Stunde geärgert und den Fehler gesucht, weils nicht "funktioniert" und immer 0 angezeigt wird. Dann habe ich mal Delay 1000 eingegeben - und siehe da - als Ergebnis 1000.
Da ist mir dann mal aufgegangen, das ich meine Schleife vielleicht nicht For i=1 to 3 und nur 3 Strings auslesen sollte.
Warum kam da wohl 0 bei raus ?
Oh man
Aber nochmal zu Register: das hätte ja schon Sinn, Variablen im Register sind ja viel schneller ansprechbar. Könnte man nicht in PB eine Variable definieren, diese per ASM ins Register verschieben ? Wenn ich dann weiter in PB programmiere, benutzt er die Variablen dann nicht per Register ?
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: C -Register "Variable" in Purebasic ?
Purebasic bekommt gerade ein C-Backend. Damit werden auch Optimierungs-Flags dazu kommen, sodass du dich wirklich um nichts mehr händisch kümmern musst. Es wird automatisch in die Register gepackt, was dort am ehesten Sinn macht. Und tatsächlich ist es bei den Unmengen an Registern heute schwierig selbst zu entscheiden, welche man nutzen sollte und wann man dies tun sollte.
- juergenkulow
- Beiträge: 188
- Registriert: 22.12.2016 12:49
- Wohnort: :D_üsseldorf-Wersten
Re: C -Register "Variable" in Purebasic ?
Code: Alles auswählen
; Register mit C Backend benutzen.
! long long register reg=0x4711471247134714LL;
! long long v_q=reg;
! asm volatile ("nop");
MessageRequester("","Inhalt des Register: $"+Hex(q.q))
CompilerIf Defined(PB_Processor_C,#PB_Constant)
CompilerIf #PB_Compiler_Processor<>#PB_Processor_C
CompilerError "Use C Backend Compiler in Compiler-Option"
CompilerEndIf
CompilerElseIf Defined(PB_Compiler_Backend,#PB_Constant)
CompilerIf #PB_Compiler_Backend<>#PB_Backend_C
CompilerError "Use C Backend Compiler in Compiler-Option"
CompilerEndIf
CompilerElse
CompilerError "Please install PureBasic version >=6.00 Alpha."
CompilerEndIf
; x64dbg gibt aus:
; 00000001400010D5 | 48:BB 1447134712471147 | mov rbx,4711471247134714 |
; 00000001400010DF | 48:895D B8 | mov qword ptr ss:[rbp-48],rbx |
; 00000001400010E3 | 90 | nop |
Zuletzt geändert von juergenkulow am 19.06.2021 17:30, insgesamt 1-mal geändert.
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Re: C -Register "Variable" in Purebasic ?
Ja, mit dem C-Backend und Optimierungsflags braucht man sich wohl wirklich nicht mehr um solche Sachen Sorgen zu machen.NicTheQuick hat geschrieben: ↑18.06.2021 13:43 Purebasic bekommt gerade ein C-Backend. Damit werden auch Optimierungs-Flags dazu kommen, sodass du dich wirklich um nichts mehr händisch kümmern musst. Es wird automatisch in die Register gepackt, was dort am ehesten Sinn macht. Und tatsächlich ist es bei den Unmengen an Registern heute schwierig selbst zu entscheiden, welche man nutzen sollte und wann man dies tun sollte.
Ist nur noch interessant, um die Systeminterna zu kennen.
Re: C -Register "Variable" in Purebasic ?
Vielen Dank !juergenkulow hat geschrieben: ↑18.06.2021 16:30Code: Alles auswählen
; Register mit C Backend benutzen. ! long long register reg=0x4711471247134714LL; ! long long v_q=reg; ! asm volatile ("nop"); MessageRequester("","Inhalt des Register: $"+Hex(q.q)) CompilerIf Defined(PB_Processor_C,#PB_Constant) CompilerIf #PB_Compiler_Processor<>#PB_Processor_C CompilerError "Use C Backend Compiler in Compiler-Option" CompilerEndIf CompilerElse CompilerError "Please install PureBasic version >=6.00 Alpha." CompilerEndIf ; x64dbg gibt aus: ; 00000001400010D5 | 48:BB 1447134712471147 | mov rbx,4711471247134714 | ; 00000001400010DF | 48:895D B8 | mov qword ptr ss:[rbp-48],rbx | ; 00000001400010E3 | 90 | nop |