hinter den kulissen, keywords
-
ich such nach einer Alternative, bspw eine Schleife ohne übliche Kontrollabfrage zu beenden. Hätte ich die Adresse oder die Codierung auf break, könnte diese ans Ende-1 eines Arrays gesetzt werden und als Anweisung wirken. So gäbs keinen Überlauf und effizienz mässig, naja, ich weiss nicht ob eine kurze Anweisung, die lediglich eine Zahl oder Adresse darstellt bis zu dem break-Punkt, wo das Programm also nicht 'denken' muss, schneller ist als bei jedem Durchlauf eine Kontrollabfrage zu durchlaufen.
Vielleicht ein Array eines user-definierten Datentyp, der mit speziellen Anweisungen und diversen built in Datentypen umzugehen weiss.
Aber dazu weiss ich einfach noch zu wenig über die Sprache.Fantasy code:
int* p = new int[1000000]; p[999999] = int(break); for(int i = 0;;++i) p[i]; //... AnweisungenIch bin aber eigentlich nicht auf der Suche nach mehr Effizienz, sondern will halt, wie der Thread schon sagt, hinter den Kulissen mal schauen. Wie ist die Sprache aufgebaut, wie werden bspw user-Anweisungen durch integrierte Funktionen beinflusst, und lassen sich diese integrierten Funktionen bzw KEywords verändern...
mfg Chris
-
Hallo
Das führt zu nichts. Lern lieber die Syntax von C++. Denn der c++ Standard schreibt keine Implementation vor, schon gar nicht auf dem Assembler-Niveau wie du es wissen willst. Das heißt selbst wenn du dir jetzt eine Möglichkeit findest das so umzusetzten läuft das mit großer wahrscheinlichkeit nur auf deinem Compiler auf deinem Betriebssystem, nichts portables.
Und der korrekte Weg mit C++ Syntax ist dort ganz in Ordnung
int* p = new int[1000000]; for(int i = 0;;++i) { if (i == 9999999) break; ... }bis bald
akari
-
ahja, das ist schade, oder vielleicht auch nicht,abhängig davon ob effizienter oder nicht. Um nochmal auf mein eigentliches Anliegen zurückzukommen, gibts irgendwelche Literatur dazu, wie man eine eigene Programmiersprache erstellt, welche Kenntnisse man dazu braucht? Bjarne Stroustrup hat nach eigenen Aussagen C++ erfunden, wie hader das gemacht?

-
Hallo
Schau dir am besten Uni-Skripte oder Bücher zum Thema Formale Sprachen und Compilerbau. Dazu wirst du keine Tutorials für einen schnellen einfachen Einstieg finden, das ist tiefste Informatik.
bis bald
akari
-
Anweisungen in c++ sind wesentlich abstrakter, als Maschienenbefehle. Ein break ist natürlich noch einfach, da es im Einfachsten Fall einfach ein Sprung ans Ende der Schleife ist, und ein Sprung hat normalerweise eine direkte entsprechung im Maschienen-Code.
Was aber, wenn ein schleifen-lokales Objekt zerstört werden muss? Dann muss break natürlich auch noch einen D'tor-Aufruf auslösen.
-
In C++ kann man solche "Optimierungen" nicht wirklich machen.
Guck dir Assembler an, da geht sowas manchmal.Du kannst aber andere Optimierungen machen, wie z.B. unrolled loops etc. Bringt aber auch meist nicht viel.
Mehr bringt es u.U. wenn man zusieht teure Befehle zu vermeiden. Dividieren ist z.B. teuer, "if" ist teuer (alle Arten von bedingten Sprüngen) etc.
Allerdings gehört da auch einiges an Erfahrung mit dem Compiler seines Vertrauens dazu um abschätzen zu können welchen Assembler Code der Compiler für bestimmte C++ Konstrukte erzeugen wird.
-
Hi, inzwischen weiss ich break nach meinen Vorstellungen einzusetzen, bringt allerdings optimierungsmässig nix und ist wie einer hier schon sagte sicher auch nicht portabel(mal nebenher, gibts eigentlich Lektüre dazu, was im speziellen portabel/nicht portabel unter c++ ist, oder sind das die unveröffentlichen Erfahrungen des einzelnen im Umgang mit Betriebssystemen?)
Eine der vielen Erkenntnisse, die ich bei diesen Megatests als Anfänger machen konnte, ist eine 20-25 % schnellere Schleife bei Zuweisungen im höherstelligen Bereich, z.b. für grosse arrays:int MAX = 40000000; int i = 0; unsigned long* harray = new unsigned long[MAX]; int counter = MAX; for(;--counter;) harray[counter] = 0xFFFFFFFF; //is flotter als counter = 0; for(;counter<MAX;++counter) harray[i] = 0xFFFFFFFF;Aber das is ja eh sicher compilerabhängig, nich portabel und wenn nicht, dann habt ihrs eh schon alle gewusst
.cu Chris
-
chris19 schrieb:
Hi, inzwischen weiss ich break nach meinen Vorstellungen einzusetzen, bringt allerdings optimierungsmässig nix und ist wie einer hier schon sagte sicher auch nicht portabel
Wer hat das gesagt? 'break' ist ein ganz normaler Befehl in C++ und damit auch protabel. Was nicht portabel ist, war dein Versuch, den Inhalt eines Array "auszuführen".
Aber das is ja eh sicher compilerabhängig, nich portabel und wenn nicht, dann habt ihrs eh schon alle gewusst
.Es ist compiler-abhängig, welche Variante sich besser optimieren lässt (aber auf Assambler-Ebene ist ein Test auf 0 meistens schneller als ein Test auf Gleichheit, also kann es durchaus sein, daß deine erste Schleife etwas schneller ist)
-
ups in die zweite schleife muss natürlich counter in die arrayindizierung.
-
CStoll schrieb:
'break' ist ein ganz normaler Befehl in C++
Befehl? Und das von einem Mod! Ich bin schockiert.
-
chris19 schrieb:
Hi, inzwischen weiss ich break nach meinen Vorstellungen einzusetzen, bringt allerdings optimierungsmässig nix und ist wie einer hier schon sagte sicher auch nicht portabel(mal nebenher, gibts eigentlich Lektüre dazu, was im speziellen portabel/nicht portabel unter c++ ist, oder sind das die unveröffentlichen Erfahrungen des einzelnen im Umgang mit Betriebssystemen?)
Eine der vielen Erkenntnisse, die ich bei diesen Megatests als Anfänger machen konnte, ist eine 20-25 % schnellere Schleife bei Zuweisungen im höherstelligen Bereich, z.b. für grosse arrays:int MAX = 40000000; int i = 0; unsigned long* harray = new unsigned long[MAX]; int counter = MAX; for(;--counter;) harray[counter] = 0xFFFFFFFF; //is flotter als counter = 0; for(;counter<MAX;++counter) harray[i] = 0xFFFFFFFF;Aber das is ja eh sicher compilerabhängig, nich portabel und wenn nicht, dann habt ihrs eh schon alle gewusst
.cu Chris
Für die höheren Weihen der Microoptimierung wandelst du noch die Schleife um, so dass das Array in Vorwärtsrichtung durchlaufen wird.
-
for(;--counter;)ist cool. Andere würde dann doch glatt
while(--counter)schreiben.
Die Frage ist jetzt, wo ist da irgendwas nicht portables bei?