Es hängt vom Compiler und der Optimierungsstufe ab. Die neuesten Versionen von GCC, auf einige gemeinsame Systeme, mit einigen Optimierungen, sind in der Lage, eine solche Optimierung zu tun (eine einfache printf
mit puts
ersetzt, die AFAIU Rechts WRT Standards wie C99 ist)
Sie sollten Warnungen aktivieren beim Kompilieren (zB zuerst versuchen, mit gcc -Wall -g
, dann debuggen mit gdb
zu kompilieren, dann, wenn Sie mit Ihrem Code sicher sind, kompilieren Sie es mit gcc -Wall -O2
)
BTW, neu zu definieren puts
wirklich wirklich hässlich ist, wenn Sie es absichtlich tun (dh codieren Ihre eigene C-Bibliothek, und dann müssen Sie den Standards folgen). Sie erhalten einige undefined behavior (siehe auch this answer über mögliche Folgen von UB). Eigentlich sollten Sie es vermeiden, die im Standard erwähnten Namen neu zu definieren, es sei denn, Sie wissen wirklich genau, was Sie tun und was im Compiler passiert.
Auch, wenn Sie mit statischen Verknüpfung wie gcc -Wall -static -O main.c -o yourprog
kompiliert habe, wette ich, dass der Linker sich beschwert hätte (über mehrere Definition von puts
).
Aber IMNSHO ist Ihr Code einfach falsch, und Sie wissen das.
Sie könnten auch kompilieren, um den Assembler zu erhalten, z. mit gcc -fverbose-asm -O -S
; und Sie könnten sogar fragen gcc
, um eine Los von "Dump" -Dateien verschütten, mit gcc -fdump-tree-all -O
, die Ihnen helfen könnte zu verstehen, was gcc
tut.
Auch diese besondere Optimierung ist gültig und sehr nützlich: die printf
Routine jeder libc muss zur Laufzeit der Druckformatstring (Umgang mit %s
etc ... speziell) „interpretieren“; das ist in der Praxis ziemlich langsam. Ein guter Compiler ist richtig, wenn es darum geht, den Aufruf printf
(und ersetzt durch puts
) wenn möglich zu vermeiden.
BTW gcc
ist nicht der einzige Compiler, der diese Optimierung durchführt. clang
macht es auch.
Auch, wenn Sie mit
gcc -ffreestanding -O2 almo.c -o almo
kompilieren das almo
Programm zeigt Hello world.
Wenn Sie eine andere Phantasie und überraschende Optimierung wollen, versuchen
// file bas.c
#include <stdlib.h>
int f (int x, int y) {
int r;
int* p = malloc(2*sizeof(int));
p[0] = x;
p[1] = y;
r = p[0]+p[1];
free (p);
return r;
}
mit gcc -O2 -fverbose-asm -S bas.c
zu kompilieren dann schau in bas.s
; Sie sehen keinen Anruf an malloc
oder an free
(tatsächlich wird keine call
Maschinenanweisung ausgegeben) und wiederum gcc
ist rechts zu optimieren (und tut dies auch clang
)!
PS: Gnu/Linux/Debian/Sid/x86-64; gcc
ist Version 4.9.1, clang
ist Version 3.4.2
Es Optimierung, die nicht auf die Optimierung Option von GCC abhängt. – BLUEPIXY
Die Frage wird mit "c" markiert, obwohl der Aufruf des Compilers darauf hinweist, dass der Code als C++ kompiliert wird. –
Ja, gcc kann einen einfachen Konstantenstringdruck von 'printf()' nach 'puts()' optimieren, da letzteres bessere Ergebnisse liefert ... da Sie die Standardbibliothek puts() durch ein lokales Symbol ersetzt haben bekommen. Wenn Sie -OO anstelle von -O2 verwenden, sollten Sie eigentlich 'printf()' – JohnH