Wie würdet ihr folgenden Codeschnippsel in C effizient machen:
-
for(i = 0; i < strlen(line); i++) { ... doSomethingWith(line); ... }
Wie ihr seht, lahmt die Schleife wegen strlen(line) und es kann vom Compiler nicht optimiert werden, weil line immer in der Schleife geändet wird.
Wie geht ihr also an das Problem heran?
Etwa ein Struct mit einem Member der die Länge enthält und immer speichert?
-
int i = 0; while(line[i++]) DoSomethingWith(line);
-
Obfuscator1 schrieb:
int i = 0; while(line[i++]) DoSomethingWith(line);
Das nenn ich dann mal Bufferoverflow erster Güte denn:
Wenn line in der Funktion kleiner wird, als dein i groß ist, dann pfuscht dein i außerhalb des Speicherbereichs von line herum und du kriegst nen Segfault.
-
int* end = line + strlen(line); int i; for(i = 0; end - i > line; i++) DoSomethingWith(line);
-
-
Who is a good C Coder? schrieb:
Etwa ein Struct mit einem Member der die Länge enthält und immer speichert?
Das wäre der für C++ übliche Weg.
Aber was ich machen würde, hängt davon ab, was doSomethingWith(line); überhaupt macht. Kann sie so geändert werden, daß sie performant die neue Stringlänge oder die Längenveränderung zurückgibt?
-
Die Laenge des C-Strings kann doch mitgezählt werden. Dann spart man sich den Aufruf von strlen... Sofern man weiß, was DoSomething tut, weiß man auch inwiefern die Laenge beeinflusst wird.
-
volkard schrieb:
Who is a good C Coder? schrieb:
Etwa ein Struct mit einem Member der die Länge enthält und immer speichert?
Das wäre der für C++ übliche Weg.
Aber was ich machen würde, hängt davon ab, was doSomethingWith(line); überhaupt macht. Kann sie so geändert werden, daß sie performant die neue Stringlänge oder die Längenveränderung zurückgibt?Ja,, du darfst doSomethingWith verändern.
-
mov cx, stringlänge lea bx, string ... inc bx loop ;ginge noch fixer, liest sich hier aber besser
-
schwupps schrieb:
mov cx, stringlänge lea bx, string ... inc bx loop ;ginge noch fixer, liest sich hier aber besser
Sieht das nach C Code aus?