Optimierungsdiskussion (aus Strings)
-
supertux schrieb:
1. benutze kein strlen in der Bedingung, das läuft dann in O(n²)
Da würde ich fast dem Compiler vertrauen, dass er das optimiert. Ansonsten hast natürlich recht.
-
Bist Du sicher, dass der Compiler sehen kann, dass sich die stringlänge in der schleife nicht ändert? Dazu müßte er ja wissen, dass sich die Speicherbereiche auf die cAZuraten und cAWoerter zeigen nicht überlappen. Ich glaube nicht dass er das kann.
-
wenn 'cAWoerter' ein 'const *const[]' ist, dann könnte er schon das 'strlen' wegoptimieren.
aber wahrscheinlich machen das die wenigsten...
-
Also der gcc scheint es nicht wegzuoptimieren. Habe ich wohl etwas zuviel Vertrauen in die Compiler gehabt
-
vista schrieb:
wenn 'cAWoerter' ein 'const *const[]' ist, dann könnte er schon das 'strlen' wegoptimieren.
aber wahrscheinlich machen das die wenigsten...bin auch deiner Meinung. Ich denke, dass der Compiler das nicht wegoptimieren kann, denn selbst wenn cAWoerter ein const ist, kann z.b. duch einen anderen Thread geändert werden. Am besten kompilieren und mit objdump sehen, was der gcc daraus macht.
-
supertux schrieb:
denn selbst wenn cAWoerter ein const ist, kann z.b. duch einen anderen Thread geändert werden.
naja, aber das wäre ein fehler im programm...
-
Wieso wäre das ein Fehler im Programm?
const sagt nicht die daten ändern sich nicht, sondern die daten dürfen nicht über diesen einen pointer geändert werden. Über einen anderen aber sehr wohl.
-
Jester schrieb:
Wieso wäre das ein Fehler im Programm?
const sagt nicht die daten ändern sich nicht, sondern die daten dürfen nicht über diesen einen pointer geändert werden. Über einen anderen aber sehr wohl.wir scheinen uns hier etwas misszuverstehen
wenn man in C ein (globales) objekt anlegt wie:const char * const array_of_strings[] = { "the C language ", "has some pitfalls ", "that drives coderz really crazy", };
dann können compiler/linker das in einen speicherbereich packen, der zur laufzeit unveränderlich ist und entsprechende optimierungen nutzen, wie z.b. 3 als anzahl der strings und die stringlängen als fix annehmen.
wenn man dann über einen char** versucht, schreibend darauf zuzugreifen, kann das voll in die hose gehen. hier ist dann die 'intelligenz' des compilers gefragt, das beste daraus zu machen.~ich sollte das vielleicht mal mit dem aggressiv optimierenden CW probieren, der optimiert wo er nur kann~
-
trotzdem dürfte es schwierig sein das zu sehen. Denn ein Zeiger gleichen Typs kann auch auf ein array zeigen, das veränderbar ist.