C
pale dog schrieb:
CStoll schrieb:
Aber nicht schlauer als der ANSI-Standard vorschreibt. Beim Compilen ist überhaupt noch nicht bekannt, was für eine Funktion sich hinter diesem ominösen Namen "strlen()" später verbergen soll - das entscheidet erst der Linker. Und der Linker muß mit dem leben, was der Compiler zusammenoptimiert hat.
wäre es nicht denkbar, dass ein compiler kenntnis von allen funktionen in allen files (.c, .lib, .obj, usw...) hat, und herausfinden kann, ob eine selbstdefinierte 'strlen'-funktion existiert oder nicht?
Nein, es sei denn er kann in die Zukunft sehen. Theoretisch arbeiten Compiler und Linker unabhängig voneinander (auch wenn die meisten modernen IDEs beide zusammenfassen), also könnte ich heute mein Programm compilieren, morgen eine neue Version der stdlib auf mein System laden und übermorgen beides zusammenlinken.
CStoll schrieb:
Das bedeutet, wenn der Compiler jetzt sagt "ich kenne strlen() und auf den selben char* angewendet liefert das immer das selbe Ergebnis" und daraufhin die regelmäßigen Funktionsaufrufe rausoptimiert, und der Linker später nicht die Standardbibliothek dazulinkt, sondern eine selbstgeschriebene (deren Version von strlen() nebenbei noch mitloggen soll, wann und wo es aufgerufen wurde), ist das herauskommende Porgamm falsch.
klar, man sieht manchmal im visual-c forum die frage: 'im debug-mode läuft mein programm, im release-mode nicht'. das hat doch bestimmt oft mit optimierungen zu tun, die im debugmodus nicht da sind.
Solche Probleme haben normalerweise nichts mit übereifrigen Optimierern zu tun, sondern damit, daß sich jemand auf undefiniertes Verhalten verlässt (ein Beispiel: Was in einem int i; steht, wird vom Standard nicht vorgeschrieben - im Debug-Modus könnte dort tatsächlich ein definierter (und zufällig richtiger) Wert eingetragen werden, im Release-Modus hast du nur ein zufälliges Bitmuster in der Hand).
@merker: Compiler und Linker arbeiten unabhängig voneinander - und der Compiler kann den Linker auch nicht zwingen, eine bestimmte Bibliothek zu verwenden.
Edit: Und selbst mit dem originalen strlen() kann man nicht davon ausgehen, daß sich der Wert zwischen zwei Schleifendurchläufen nicht ändert