Die verpönten goto´s



  • earli schrieb:

    Also mir gefällt der Code von Big Brother besser, aber der Style von noobLolo (diese ganzen Leerzeichen bei den Klammern von Big Brother kann ich gar nicht leiden :D).

    Ja, als ich den Code von Big Brother gesehen hab, mußte ich natürlich auch eingestehen das er viel schneller erfaßbar ist. Und da sind wir sicher nicht die einzigen, sondern 99.9% werden so denken.

    0.1% war ich, denn ich hab ja den anderen gebastelt, mit der Intention die 2 Multiplikationen für die 2. Dimension zu vermeiden, aber als ich dann den compiler auf -O3 gestellt hab waren die wieder drin 🙄



  • [quote="noobLolo"]

    earli schrieb:

    0.1% war ich, denn ich hab ja den anderen gebastelt, mit der Intention die 2 Multiplikationen für die 2. Dimension zu vermeiden, aber als ich dann den compiler auf -O3 gestellt hab waren die wieder drin 🙄

    Das ist auch mal ganz grober Unfug. Multiplikationen sind Kinderkacke, wenn du in jedem Durchlauf zig Pointer dereferenzierst.



  • earli schrieb:

    Multiplikationen sind Kinderkacke

    Kinderkacke macht meine cpu mit einem Takt, Multiplikationen nicht 😉



  • schpätli schrieb:

    void foo (void)  // hier gehört "void" in die Klammer
    {
      allocateX();
    ...
    }
    

    Wir koennen jetzt gerne weitere tolle, allgemeine und nichts-sagende Beispiele entwerfen. Aber ich wuerde so einen Code nie schreiben. Und es liegt nicht am goto.

    "Faustregel"



  • noobLolo schrieb:

    earli schrieb:

    Multiplikationen sind Kinderkacke

    Kinderkacke macht meine cpu mit einem Takt, Multiplikationen nicht 😉

    Näherungsweise schon, wenn du jetzt nicht gerade mit einem 286er unterwegs bist. (Stichwort: Pipelining.) Und die for-Schleifen machen das Ganze so vorhersehbar für den Compiler, dass nichtmal branch prediction erforderlich ist.



  • earli schrieb:

    Das ist auch mal ganz grober Unfug. Multiplikationen sind Kinderkacke, wenn du in jedem Durchlauf zig Pointer dereferenzierst.

    Ne, spielt keine so große Rolle, weil die meisten Compiler Variablenzugriffe sowieso auf indirekt- indizierten ASM abzubilden versuchen. Weil man so das meiste gebacken bekommt oder sich sonst was mit einem möglichen OS beißt, plagt sich kaum jemand mit auf direkter Adressierung basierender Optimierung rum.
    Ist jetzt eine sehr verkürzte Darstellung und sachlich im Detailbereich nicht zu 100% richtig, aber Deref's sind meistens ziemlich egal, weil der Frame eigentlich immer auch indirekt- indiziert aufgelöst wird.

    Zum Topic:
    Ich habe die gotos für cleanups seit etwa einem Jahr wiederentdeckt und etliche Zeilen Sinnlos- Code aus meinen Libs geschmissen, was zeigt, daß goto nicht nötig ist, aber manchmal saupraktisch und besser lesbaren Code zu erzeugen helfen kann.

    @Lolo
    Ich mag BB's Code auch lieber, weil eher 'Spirit of C'.
    😃



  • knivil schrieb:

    Wir koennen jetzt gerne weitere tolle, allgemeine und nichts-sagende Beispiele entwerfen.

    Also für mich war die Message jedes Beispieles immer leicht versändlich

    knivil schrieb:

    Aber ich wuerde so einen Code nie schreiben. Und es liegt nicht am goto.

    Dann zeig doch mal wie du das machen würdest (am besten anhand eines Beispieles), und jetzt komm nicht mit nem statischen Array daher... :p



  • Dann zeig doch mal wie du das machen würdest (am besten anhand eines Beispieles)

    Hast du ein konkretes Problem?



  • pointercrash() schrieb:

    earli schrieb:

    Das ist auch mal ganz grober Unfug. Multiplikationen sind Kinderkacke, wenn du in jedem Durchlauf zig Pointer dereferenzierst.

    Ne, spielt keine so große Rolle, weil die meisten Compiler Variablenzugriffe sowieso auf indirekt- indizierten ASM abzubilden versuchen. Weil man so das meiste gebacken bekommt oder sich sonst was mit einem möglichen OS beißt, plagt sich kaum jemand mit auf direkter Adressierung basierender Optimierung rum.

    Es handelt sich aber nicht um gewöhnliche Variablenzugriffe, sondern auf Zugriffe in den Heap (malloc()) oder auf unbekannte Variablen im Stack von den aufrufenden Funktionen. Dein Trick geht nur mit Variablen auf dem Stacksegment der Funktion selbst oder mit statischen Fields.



  • knivil schrieb:

    Dann zeig doch mal wie du das machen würdest (am besten anhand eines Beispieles)

    Hast du ein konkretes Problem?

    Herausspringen aus dreifacher Verschachtelung z.B. Und sag nicht, Du willst das mit einem Flag machen, oder den Code nur deshalb in eine Funktion auslagern.



  • Herausspringen aus dreifacher Verschachtelung

    Das ist kein konkretes Problem. Wahrscheinlich wuerde ich keine dreifach verschachtelte Schleife schreiben.

    jetzt komm nicht mit nem statischen Array daher ... Flag machen ... Funktion auslagern

    Du verbietest pauschal ganz schoen viel, ohne ein konkretes Problem genannt zu haben.



  • knivil schrieb:

    Herausspringen aus dreifacher Verschachtelung

    Das ist kein konkretes Problem. Wahrscheinlich wuerde ich keine dreifach verschachtelte Schleife schreiben.

    Wie machst du dann eine Matrixmultiplikation?



  • Wie machst du dann eine Matrixmultiplikation?

    Muss ich bei einer Matrixmultiplikation irgendwann aus den for-Schleifen herausspringen? Und wahrscheinlich hat man sowieso schon Funktionen fuer Skalarprodukt, Matrix * Vektor und Co.



  • knivil schrieb:

    Wie machst du dann eine Matrixmultiplikation?

    Muss ich bei einer Matrixmultiplikation irgendwann aus den for-Schleifen herausspringen? Und wahrscheinlich hat man sowieso schon Funktionen fuer Skalarprodukt, Matrix * Vektor und Co.

    Ja mei natürlich gibt es scheinbar keinen Fall wo sich ein goto nicht ersetzen lässt. Ich such ja auch schon ständig, um mein Bedürfnis zu rechtfertigen 😃



  • noobLolo schrieb:

    knivil schrieb:

    Wie machst du dann eine Matrixmultiplikation?

    Muss ich bei einer Matrixmultiplikation irgendwann aus den for-Schleifen herausspringen? Und wahrscheinlich hat man sowieso schon Funktionen fuer Skalarprodukt, Matrix * Vektor und Co.

    Ja mei natürlich gibt es scheinbar keinen Fall wo sich ein goto nicht ersetzen lässt. Ich such ja auch schon ständig, um mein Bedürfnis zu rechtfertigen 😃

    Java hat kein goto. Aber Java hat auch eine Garbage Collection. Vielleicht ist das kein Zufall. 😃



  • earli schrieb:

    Java hat kein goto. Aber Java hat auch eine Garbage Collection. Vielleicht ist das kein Zufall.

    Java hat "break mit Labels": http://java.sun.com/docs/books/tutorial/java/nutsandbolts/examples/BreakWithLabelDemo.java
    Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.



  • Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.

    Jetzt geht das schon wieder los.



  • Javaspezialist schrieb:

    Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.

    Das ist schon wieder grober Unfug. Was macht denn eine Sprache "vernünftig"?

    Funktionale Sprachen sind auch in der Industrie weit verbreitet. Natürlich nicht unter Waldundwiesen-Hobbyprogrammierern und Windows-Klickapp-Codemonkeys. Aber was meinst du, wie Google und Co. das hinbekommen, dir in Millisekunden Millionen von Ergebnissen zu einem Suchwort zu präsentieren?

    Vielleicht hast du ja schonmal was von Erlang gehört.



  • knivil schrieb:

    Keine vernünftige Sprache kommt ohne eine Form von GOTO aus. Ausser funktionale Sprachen, aber deren Nutzen ist nur akademisch.

    Jetzt geht das schon wieder los.

    C soll doch Maschienennah sein, zeig mir mal 15 Zeilen asm wo kein

    "JMP label"
    "JE label"
    "JNE label"
    ...

    drin ist...

    earli schrieb:

    Aber was meinst du, wie Google und Co. das hinbekommen, dir in Millisekunden Millionen von Ergebnissen zu einem Suchwort zu präsentieren?

    weil sie die besten Algos in feine C-Apps eingebaut haben, bzw. verwendete google nicht mal mysql? oder waren das alles nur gerüchte?



  • C soll doch Maschienennah sein, zeig mir mal 15 Zeilen asm wo kein

    Irrelevant, C ist nicht Assembler.

    weil sie die besten Algos in feine C-Apps eingebaut haben, bzw. verwendete google nicht mal mysql? oder waren das alles nur gerüchte?

    Amazon z.B. hat in den ersten Tagen nur C und Lisp verwendet.

    Without understanding functional programming, you can't invent MapReduce, the algorithm that makes Google so massively scalable. [...] I don't think Microsoft completely understands just how far behind they are on that wave.

    Ihr duerft auch gern den ganzen Artikel lesen: http://www.joelonsoftware.com/items/2006/08/01.html . Andere interessante Artikel sind dort auch verlinkt.


Anmelden zum Antworten