私の理解に基づいて、ltraceユーティリティを使用してライブラリ呼び出しをトレースします。 printf
だけを呼び出す単純なプログラムがありますが、表示されるライブラリ関数はprintf
の代わりにputs
です。私はなぜそれがprintf
しかし、puts
を表示しないのが不思議ですか?ltrace printf()ですが、puts()を表示します
3
A
答えて
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
(または他の多くの共通関数の1つ)を呼び出さないアセンブリコードなどがあります。コンパイラはプログラムの意味を尊重する必要があるだけで、呼び出される実際の関数を尊重する必要はありません。 printf
とputs
は、再定義することができない標準的な関数なので、これらの関数が何をしているかを知っており、有用であると考えられる場合には置き換えることができます。ここで
puts
は(それが%
フォーマットを解釈することはありませんし、それが可変長ではありません)単純であるため、より高速なので、puts
はprintf
に置換しました。この場合、printf
をputs
と置き換えることができました。文字列の印刷には書式指定子の解釈が必要なく、文字列の末尾が\n
だったためです。
1
単なる最適化です。コンパイラはprintf("smth\n")
をputs("smth")
に置き換えます。出力は同じですが、puts()
はより速く動作するはずです。
関連する問題
- 1. printfやputsのどちらを使用していても、逆アセンブルするとputsが表示されるのはなぜですか?
- 2. printfでワイド文字を表示する
- 3. Java printfが表示されない
- 4. コンパイル中にprintfが表示されます
- 5. sleep()を使用しているときのCのputs()とprintf()の違い
- 6. bashでprintfが正しく表示されない
- 7. RSpecで `puts`をチェックする
- 8. puts()はいつ失敗しますか?
- 9. デバッグ時にIDEでprintfメッセージを表示する
- 10. coutとprintfはリンクされたリストを表示する際に異なる結果を表示します
- 11. Androidのltraceの作成
- 12. 永久テーブルの表示\ printf()のリスト
- 13. シェルのprintfは最初の単語だけを表示します
- 14. なぜprintfは最初の文字だけを表示しますか?
- 15. 何らかの理由でprintf関数が表示したい部分にスペースを追加します
- 16. putsをスレッドセーフにする
- 17. putsによって返されるnilは何を表していますか?
- 18. printf小数点以下2桁を表示しない
- 19. printf()の呼び出しがコンソールに正しい文字を表示できないのはなぜですか?
- 20. GoLang printfはtime.Sleepを使用した後も何も表示しません。
- 21. ltraceは2回の呼び出しだけを出力します
- 22. printfで二重にし、javaでprintfと線を整列する
- 23. Ruby selfとputs
- 24. %sは、printfが大きな整数を正しく表示できる唯一の形式ですか?
- 25. SSRSのボタンを非表示にしますが、オンラインビューで表示します
- 26. メインウィンドウが表示された後でダイアログを表示します
- 27. タブバーコントローラーは非表示ですが、非表示のままです
- 28. JavaScriptがページを表示して値を表示しますか?
- 29. putc、fputc、puts、fputs、putchar(そして多分printf)関数の戻り値を決してチェックする人はいません。どうして?
- 30. puts()gets()とストリームは一般的になしでungetc()をラップします
ご返信ありがとうございます。 printfとputsの関係は何ですか? – HuangJie
@HuangJie 'puts'は、'% '形式の指示を解釈しないので、より簡単です(したがって高速です)。そして、それ自身の最後に '\ n'を追加します。 –