2016-07-08 4 views
3

Основываясь на моем понимании, утилита ltrace используется для отслеживания вызовов библиотеки. I ltrace простая программа, которая вызывает только printf, но то, что отображается в библиотечной функции, - puts вместо printf. Мне любопытно, почему он не показывает printf, но puts?ltrace printf() но показывает puts()

ответ

5

ltrace показывает puts, вызываемый, потому что он работает в двоичном файле и вызывает двоичный файл puts.

Example: Источник:

#include <stdio.h> 

int main(int c, char *v[]) 
{ 
    printf("hello world\n"); 
} 

Монтаж:

.LC0: 
     .string "hello world" 
main: 
     subq $8, %rsp 
     movl $.LC0, %edi 
     call puts 
     xorl %eax, %eax 
     addq $8, %rsp 
     ret 

Если вы играете с большим количеством примеров, вы можете обнаружить, что компилятор производит ассемблерный код, который вызывает memcpy когда исходный код не делает, код сборки, который не вызывает memcpy (или одну из многих других общих функций), когда выполняется исходный код, и так далее. Компилятор должен только учитывать смысл программы, и не нужно уважать вызываемые функции. Поскольку printf и puts являются стандартными функциями, которые вам не разрешено переопределять, он знает, что эти функции делают и могут заменить один на другой, если он сочтет это полезным.

Здесь puts был заменен на printf потому puts проще (не интерпретировать % форматов и не VARIADIC), и, следовательно, быстрее. В этом случае компилятору было позволено заменить printf на puts, потому что для печати строки не требовалась интерпретация любого спецификатора формата, и строка закончилась в \n.

+0

Спасибо за ваш ответ. Могу ли я узнать, что такое отношения между printf и помещается здесь? – HuangJie

+0

@HuangJie 'puts' проще (и, следовательно, быстрее), потому что он не интерпретирует никаких индикаторов формата'% '. И он добавляет '\ n' в конце сам по себе. –

1

Это просто оптимизация. Компилятор заменяет printf("smth\n") на puts("smth"), потому что результат тот же, но puts() должен работать быстрее.

Смежные вопросы