Seite 1 von 1

C -Register "Variable" in Purebasic ?

Verfasst: 17.06.2021 17:53
von Franky_FR
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 ?

Re: C -Register "Variable" in Purebasic ?

Verfasst: 17.06.2021 19:28
von GPI
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

Re: C -Register "Variable" in Purebasic ?

Verfasst: 17.06.2021 19:35
von Franky_FR
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
ah,ok.
Ich muß zugeben, meine C-Literatur ist auch aus der Millenium-Zeit :lol:
Leicht veraltet, aber für die Grundlagen reicht es.

Re: C -Register "Variable" in Purebasic ?

Verfasst: 17.06.2021 19:50
von GPI
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.

Re: C -Register "Variable" in Purebasic ?

Verfasst: 18.06.2021 10:32
von Franky_FR
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 :D
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. :lol:
Warum kam da wohl 0 bei raus ? :shock:
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 ?

Re: C -Register "Variable" in Purebasic ?

Verfasst: 18.06.2021 13:43
von NicTheQuick
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.

Re: C -Register "Variable" in Purebasic ?

Verfasst: 18.06.2021 16:30
von juergenkulow

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                                                         |
Edit: CompilerIf #PB_Compiler_Backend<>#PB_Backend_C

Re: C -Register "Variable" in Purebasic ?

Verfasst: 18.06.2021 17:45
von Franky_FR
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.
Ja, mit dem C-Backend und Optimierungsflags braucht man sich wohl wirklich nicht mehr um solche Sachen Sorgen zu machen.
Ist nur noch interessant, um die Systeminterna zu kennen.

Re: C -Register "Variable" in Purebasic ?

Verfasst: 18.06.2021 17:45
von Franky_FR
juergenkulow hat geschrieben: 18.06.2021 16:30

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
  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                                                         |
Vielen Dank !