2016-07-08 9 views
3

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

5

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.

+0

Vielen Dank für Ihre Antwort. Darf ich wissen, was die Beziehung zwischen printf und puts hier ist? – HuangJie

+0

@HuangJie 'puts' ist einfacher (und somit schneller), weil es keine'% 'Formatanzeige interpretiert. Und fügt am Ende ein '\ n' hinzu. –

1

Es ist nur eine Optimierung. Compiler ersetzt printf("smth\n") durch puts("smth"), da die Ausgabe identisch ist, aber puts() sollte schneller funktionieren.

Verwandte Themen