Wie kann ich meinen Code verbessern?



  • hustbaer schrieb:

    @Wutz
    Du korrigierst doch gar nichts, du beschimpfst bloss.
    Was sind die Argumente gegen den Vorschlag von swapper?

    Versteh mich nicht falsch, aber wo hat denn swapper einen Vorschlag gemacht? Für mich hat das den Geschmack von subjektiver Code-Gestaltung, mehr nicht. dachschaden hat wenigstens einen Anwendungsfall genannt an dem festzustellen ist, warum er Parameter einzeln übergibt anstatt als struct oder weiss der Geier was.

    Dahingegen hat swapper nur gesagt, er würde ab Parameterzahl X ein struct nehmen. Für mich eine Antwort im persönlichen, nicht professionellen Stil.

    Wenn swapper einen Vorschlag macht, kann er dies ja auch mit Argumenten belegen, oder etwa nicht? Klar, die Antwort von Wutz hätte auch höflicher gestaltet werden können.



  • Bierkorken schrieb:

    [Dahingegen hat swapper nur gesagt, er würde ab Parameterzahl X ein struct nehmen. Für mich eine Antwort im persönlichen, nicht professionellen Stil.

    Also ich hab den Thread jetzt nicht ganz durchgelesen, aber ich persönlich würde immer ein struct nehmen, auch wenn es nur zwei Parameter wären und auch nur wenn die Parameter was miteinander zu tun haben.



  • Pils schrieb:

    Bierkorken schrieb:

    [Dahingegen hat swapper nur gesagt, er würde ab Parameterzahl X ein struct nehmen. Für mich eine Antwort im persönlichen, nicht professionellen Stil.

    Also ich hab den Thread jetzt nicht ganz durchgelesen, aber ich persönlich würde immer ein struct nehmen, auch wenn es nur zwei Parameter wären und auch nur wenn die Parameter was miteinander zu tun haben.

    Hi,

    ja im Grunde wäre es bei mir im Code auch genau der Fall, ohne diese "Grunddaten" kann keine der Funktionen irgendetwas machen. Hier wäre eine Gruppierung in einem Parameter-Struct vermutlich wirklich sinnvoll.

    Auch sollte der Overhead dabei etwas geringer sein einen Parameter statt 5-6-7... zu übergeben? Wie gesagt, ich kann das selbst nicht so einschätzen, ich hatte nur mal gelesen das man Parameterübergaben "kurz" halten/gestalten soll.

    Die Idee ein Struct zu verwenden find ich per se auch sehr gut, da man den ganzen "Kontroll-Fluß" bündelt und alle wichtigen Parameter an einem Punkt "abgreifbar" hat, was sich natürlich auch erweitern lässt, ohne an fünf Stellen die Parameter umzuschreiben.

    Was mir dabei nur einfällt, wie sieht es aus mit Rekursion? - Wenn ich ein Struct habe das eine Funktion benötigt, aber eine andere Variante wieder an sich selbst übergeben werden muß. Mh - dann wäre das wohl nicht so praktisch?



  • Bierkorken schrieb:

    Wenn swapper einen Vorschlag macht, kann er dies ja auch mit Argumenten belegen, oder etwa nicht?

    ein pointer auf eine struct als parameter hat mehrere vorteile. der funktionsprototyp wird übersichtlicher, die parameter bilden eine logische einheit und die funktion kann z.b. ihr ergebnis in die struct zurückschreiben. das kann man soweit treiben, bis man oop in c hat. 🙂



  • swapper schrieb:

    Bierkorken schrieb:

    Wenn swapper einen Vorschlag macht, kann er dies ja auch mit Argumenten belegen, oder etwa nicht?

    ein pointer auf eine struct als parameter hat mehrere vorteile. der funktionsprototyp wird übersichtlicher, die parameter bilden eine logische einheit und die funktion kann z.b. ihr ergebnis in die struct zurückschreiben. das kann man soweit treiben, bis man oop in c hat. 🙂

    Klingt logisch. 😉



  • auch kann ein funktionsaufruf bei parameterübergabe durch einen struct-pointer schneller sein. bei übergabe über den stack (z.b. 5 * push für 5 argumente) braucht man nur ein push für den struct-pointer.



  • swapper schrieb:

    auch kann ein funktionsaufruf bei parameterübergabe durch einen struct-pointer schneller sein. bei übergabe über den stack (z.b. 5 * push für 5 argumente) braucht man nur ein push für den struct-pointer.

    So etwas hätte ich auch vermutet, ich versuche mal ob ich das nicht in das Projekt implementieren kann. Hab mich lange Zeit genug davor gedrückt derartige "Optimierungen" durchzuführen.

    Und ich glaube viel wird sich an dem Grundaufbau auch nicht mehr verändern so das ich mich auf die Parameter verlassen kann die jetzt bereits alles am Laufen halten.

    Danke für das Feedback. 👍



  • swapper schrieb:

    auch kann ein funktionsaufruf bei parameterübergabe durch einen struct-pointer schneller sein. bei übergabe über den stack (z.b. 5 * push für 5 argumente) braucht man nur ein push für den struct-pointer.

    Mag sein, dass der Aufruf dann schneller wird, dafür wird andererseits die Funktion an sich langsamer, da jedesmal der Zeiger dereferenziert werden muss, wenn man auf einen Parameter zugreifen möchte. Typischer Fall von premature optimization.

    Warum ich Parameter nicht als struct übergeben würde ist einfach: Damit wird jeder Anwender der Funktion gezwungen die Parameter erst in eine struct zu kopieren bevor die Funktion aufgerufen werden kann, obwohl die Parameter bereits anderweitig zur Verfügung stehen. Das verkompliziert oft die Verwendung einer allgemeinen Funktion im Zusammenhang mit verschiedenen APIs, da jedesmal die Parameter in eine struct gesteckt werden müssen.



  • Biolunar schrieb:

    Mag sein, dass der Aufruf dann schneller wird, dafür wird andererseits die Funktion an sich langsamer, da jedesmal der Zeiger dereferenziert werden muss

    Nö. Wenn es sich nur um ein Objekt vom gleichen Typen in der Funktion handelt, wird der Code in der Regel dahingehend optimiert, dass der Zeiger als restrict angesehen wird. Sprich, die Funktion kann sich darauf verlassen, dass sich die Werte innerhalb ihrer Ausführung nicht ändern, und kann anfangen, munter in Register zu cachen.

    Das geht dann aber sehr weit in das verwendete ABI und die Caching-Methode der CPU, was dann effektiv schneller ist. Deswegen habe ich das in meinem ersten Post auch nicht angesprochen und lieber Gründe genannt, die dafür und dagegen sprechen (z.B. dass ein Objekt bei rekursiven Funktionen hilft, den Frame möglichst klein zu halten - solange immer nur das gleiche Objekt durchgereicht wird - vs. Komfort und Standardparameter).



  • Biolunar schrieb:

    swapper schrieb:

    auch kann ein funktionsaufruf bei parameterübergabe durch einen struct-pointer schneller sein. bei übergabe über den stack (z.b. 5 * push für 5 argumente) braucht man nur ein push für den struct-pointer.

    Mag sein, dass der Aufruf dann schneller wird, dafür wird andererseits die Funktion an sich langsamer, da jedesmal der Zeiger dereferenziert werden muss, wenn man auf einen Parameter zugreifen möchte. Typischer Fall von premature optimization.

    stimmt, geschwindigkeitsmäßig bringt es letztendlich wohl gar nichts.

    Biolunar schrieb:

    Warum ich Parameter nicht als struct übergeben würde ist einfach: Damit wird jeder Anwender der Funktion gezwungen die Parameter erst in eine struct zu kopieren bevor die Funktion aufgerufen werden kann, obwohl die Parameter bereits anderweitig zur Verfügung stehen. Das verkompliziert oft die Verwendung einer allgemeinen Funktion im Zusammenhang mit verschiedenen APIs, da jedesmal die Parameter in eine struct gesteckt werden müssen.

    ich finde structs ab einer bestimmten anzahl an params recht praktisch. so eine struct kann ja auch ganz oder teilweise wiederverwendet werden. man muss sie also nicht jedes mal komplett neu anlegen und befüllen. manchmal ändern sich vielleicht nur ein oder zwei members. bei großen structs kann man sich z.b eine funktion basteln, die dir ein mit defaultwerten gefülltes exemplar erzeugt.


Anmelden zum Antworten