Basierend auf meinem Verständnis, ltrace Dienstprogramm wird verwendet, um Bibliotheksaufrufe zu verfolgen. Itrace ein einfaches Programm, das nur printf
aufruft, aber was die Bibliothek-Funktion angezeigt wird, ist puts
statt printf
. Ich bin neugierig, warum es printf
aber puts
nicht zeigt?ltrace printf() aber zeigt puts()
Antwort
ltrace
zeigt puts
wird aufgerufen, weil es auf die Binärdatei und die binäre Dateiaufrufe puts
funktioniert.
Example: Quelle:
#include <stdio.h>
int main(int c, char *v[])
{
printf("hello world\n");
}
Montage:
.LC0:
.string "hello world"
main:
subq $8, %rsp
movl $.LC0, %edi
call puts
xorl %eax, %eax
addq $8, %rsp
ret
Wenn Sie mit mehr Beispiele spielen, können Sie feststellen, dass der Compiler Assembler-Code, der memcpy
erzeugt, wenn der Quellcode nicht tut nennt, Assembler-Code, der memcpy
(oder eine von vielen anderen allgemeinen Funktionen) nicht aufruft, wenn der Quellcode dies tut, und so weiter. Der Compiler muss nur die Bedeutung des Programms respektieren, er muss nicht die tatsächlich aufgerufenen Funktionen berücksichtigen. Da es sich bei printf
und puts
um Standardfunktionen handelt, die Sie nicht neu definieren dürfen, weiß sie, was diese Funktionen tun und kann sie ersetzen, wenn sie dies für sinnvoll halten.
Hier wurde puts
-printf
ersetzt, weil puts
einfacher ist (es nicht interpretieren %
Formate und es ist nicht variadische) und damit schneller. Der Compiler durfte in diesem Fall printf
durch puts
ersetzen, da das Drucken der Zeichenfolge nicht die Interpretation eines Formatbezeichners erforderte und die Zeichenfolge zufällig in \n
endete.
Es ist nur eine Optimierung. Compiler ersetzt printf("smth\n")
durch puts("smth")
, da die Ausgabe identisch ist, aber puts()
sollte schneller funktionieren.
- 1. C Strings, Pointer, Puts
- 2. printf zeigt Fehler beim Kompilieren an
- 3. OMAP: Erstellen und Installieren von ltrace
- 4. Unterschied zwischen puts() und printf() in C während der Verwendung von sleep()
- 5. Kann printf durch Puts automatisch in einem C-Programm ersetzt werden?
- 6. Machen puts thread-safe
- 7. Wann wird puts() fehlschlagen?
- 8. Ruby self und puts
- 9. ltrace: Konnte nicht .dynsym oder .dynstr in "library.so" finden
- 10. Warum funktioniert Puts im folgenden Code nicht?
- 11. Warum zeigt printf -1. # IND für FPTAN-Ergebnisse?
- 12. zeigt Valgrind Speicherverlust für printf und ungenutzte Blöcke
- 13. GoLang printf zeigt nichts, auch nach der Verwendung von time.Sleep
- 14. "puts" -Methode in Schienen 3
- 15. JFrame zeigt aber ist leer
- 16. Wie verwenden Sie printf von Assembly?
- 17. Präzisionsspezifizierer als Parameter wie printf, aber in String.Format
- 18. php array_unique Methode "puts Schlüssel in Array"
- 19. Was bedeutet printf (_ ("Hallo, Welt \ n"))?
- 20. Android Spinner zeigt Array nicht an, zeigt aber Orte
- 21. SSL-Zertifikat: Signaturalgorithmus zeigt "sha256rsa", aber Fingerabdruckalgorithmus zeigt "sha1"
- 22. ng-repeat zeigt keine Daten an, zeigt aber korrekte Länge
- 23. Printf für
- 24. Umleiten der "puts" -Befehlsausgabe in eine Protokolldatei
- 25. Rückruf für Puts und warnen Ruby
- 26. C++ puts Funktionen in separaten Quelldateien
- 27. puts vs Logger in Schienen rake Aufgaben
- 28. Direkt "puts" in Rails, zu Apache log
- 29. Amazon SDB - Puts pro Sekunde Grenze erklärt?
- 30. ähnliche Syntax aber man zeigt Fehler, aber andere nicht
Vielen Dank für Ihre Antwort. Darf ich wissen, was die Beziehung zwischen printf und puts hier ist? – HuangJie
@HuangJie 'puts' ist einfacher (und somit schneller), weil es keine'% 'Formatanzeige interpretiert. Und fügt am Ende ein '\ n' hinzu. –