Dalam C ++ apa perbedaan mendasar antara std:: cout dan fprintf? Apakah yang satu lebih baik atau lebih cepat dari yang lain?


Jawaban 1:

Dengan std :: cout, operator kelebihan << dipanggil pada argumen sementara dengan fprintf, argumen tersebut dilemparkan ke string. Logika dasar di balik keduanya tetap sama.

cstdio lebih cepat dengan sinkronisasi diaktifkan tetapi iostream menjadi lebih cepat, dan dalam beberapa kasus jauh lebih cepat jika Anda menonaktifkan sinkronisasi antara keduanya. Dalam kode C ++ yang baik, hanya iostream yang harus digunakan dan dengan demikian Anda dapat menonaktifkan sinkronisasi dengan memanggil std :: ios :: sync_with_stdio (false).

CATATAN

Bertentangan dengan kepercayaan populer, jika fungsi yang sama ada untuk perpustakaan C ++ dan C library, implementasi C ++ akan hampir selalu lebih baik karena optimisasi kompiler.


Jawaban 2:

Ya, std :: cout lebih baik. Ini std :: ostream, dan std :: stringstream, yang serupa dengan varian printf yang disebut sprintf.

Ada beberapa masalah dengan printf.

  1. Ia menggunakan string format untuk menentukan tidak hanya bagaimana mencetak argumen yang tersisa, tetapi juga untuk menentukan apa tipe-tipe itu, yang tidak melibatkan sistem tipe, sehingga kompiler tidak mengetahui jenis-jenis hal yang Anda pencetakan. Untuk memperbaiki masalah ini, kompiler C dan C ++ yang lebih baru mencoba menafsirkan string ini pada waktu kompilasi, yang merupakan perlakuan khusus untuk fungsi ini. Tidak ada fungsi yang harus diperlakukan secara khusus. Ia menggunakan varargs, yang menghapus tipe, jadi masalah # 1 cukup penting, padahal seharusnya tidak.

Std :: ostream, seperti std :: cout, memiliki operator << yang ditentukan untuk setiap jenis yang ingin Anda cetak, dan kebanyakan dari mereka dapat memanggil operator << dari tipe primitif mereka untuk menyelesaikan tugas ini. Setiap << fungsi operator tahu tipe yang dicetaknya, dan jenisnya benar-benar aman pada saat kompilasi, sehingga masalah runtime karena tidak cukupnya argumen yang dicetak ke formatf string tidak lagi menjadi masalah karena std :: ostream doesn ' t perlu format string.

Perbedaan kecepatan sepenuhnya tergantung pada implementasi, tetapi std :: cout memiliki kemampuan untuk lebih cepat daripada mencetak melalui inlining.


Jawaban 3:

Ya, std :: cout lebih baik. Ini std :: ostream, dan std :: stringstream, yang serupa dengan varian printf yang disebut sprintf.

Ada beberapa masalah dengan printf.

  1. Ia menggunakan string format untuk menentukan tidak hanya bagaimana mencetak argumen yang tersisa, tetapi juga untuk menentukan apa tipe-tipe itu, yang tidak melibatkan sistem tipe, sehingga kompiler tidak mengetahui jenis-jenis hal yang Anda pencetakan. Untuk memperbaiki masalah ini, kompiler C dan C ++ yang lebih baru mencoba menafsirkan string ini pada waktu kompilasi, yang merupakan perlakuan khusus untuk fungsi ini. Tidak ada fungsi yang harus diperlakukan secara khusus. Ia menggunakan varargs, yang menghapus tipe, jadi masalah # 1 cukup penting, padahal seharusnya tidak.

Std :: ostream, seperti std :: cout, memiliki operator << yang ditentukan untuk setiap jenis yang ingin Anda cetak, dan kebanyakan dari mereka dapat memanggil operator << dari tipe primitif mereka untuk menyelesaikan tugas ini. Setiap << fungsi operator tahu tipe yang dicetaknya, dan jenisnya benar-benar aman pada saat kompilasi, sehingga masalah runtime karena tidak cukupnya argumen yang dicetak ke formatf string tidak lagi menjadi masalah karena std :: ostream doesn ' t perlu format string.

Perbedaan kecepatan sepenuhnya tergantung pada implementasi, tetapi std :: cout memiliki kemampuan untuk lebih cepat daripada mencetak melalui inlining.


Jawaban 4:

Ya, std :: cout lebih baik. Ini std :: ostream, dan std :: stringstream, yang serupa dengan varian printf yang disebut sprintf.

Ada beberapa masalah dengan printf.

  1. Ia menggunakan string format untuk menentukan tidak hanya bagaimana mencetak argumen yang tersisa, tetapi juga untuk menentukan apa tipe-tipe itu, yang tidak melibatkan sistem tipe, sehingga kompiler tidak mengetahui jenis-jenis hal yang Anda pencetakan. Untuk memperbaiki masalah ini, kompiler C dan C ++ yang lebih baru mencoba menafsirkan string ini pada waktu kompilasi, yang merupakan perlakuan khusus untuk fungsi ini. Tidak ada fungsi yang harus diperlakukan secara khusus. Ia menggunakan varargs, yang menghapus tipe, jadi masalah # 1 cukup penting, padahal seharusnya tidak.

Std :: ostream, seperti std :: cout, memiliki operator << yang ditentukan untuk setiap jenis yang ingin Anda cetak, dan kebanyakan dari mereka dapat memanggil operator << dari tipe primitif mereka untuk menyelesaikan tugas ini. Setiap << fungsi operator tahu tipe yang dicetaknya, dan jenisnya benar-benar aman pada saat kompilasi, sehingga masalah runtime karena tidak cukupnya argumen yang dicetak ke formatf string tidak lagi menjadi masalah karena std :: ostream doesn ' t perlu format string.

Perbedaan kecepatan sepenuhnya tergantung pada implementasi, tetapi std :: cout memiliki kemampuan untuk lebih cepat daripada mencetak melalui inlining.


Jawaban 5:

Ya, std :: cout lebih baik. Ini std :: ostream, dan std :: stringstream, yang serupa dengan varian printf yang disebut sprintf.

Ada beberapa masalah dengan printf.

  1. Ia menggunakan string format untuk menentukan tidak hanya bagaimana mencetak argumen yang tersisa, tetapi juga untuk menentukan apa tipe-tipe itu, yang tidak melibatkan sistem tipe, sehingga kompiler tidak mengetahui jenis-jenis hal yang Anda pencetakan. Untuk memperbaiki masalah ini, kompiler C dan C ++ yang lebih baru mencoba menafsirkan string ini pada waktu kompilasi, yang merupakan perlakuan khusus untuk fungsi ini. Tidak ada fungsi yang harus diperlakukan secara khusus. Ia menggunakan varargs, yang menghapus tipe, jadi masalah # 1 cukup penting, padahal seharusnya tidak.

Std :: ostream, seperti std :: cout, memiliki operator << yang ditentukan untuk setiap jenis yang ingin Anda cetak, dan kebanyakan dari mereka dapat memanggil operator << dari tipe primitif mereka untuk menyelesaikan tugas ini. Setiap << fungsi operator tahu tipe yang dicetaknya, dan jenisnya benar-benar aman pada saat kompilasi, sehingga masalah runtime karena tidak cukupnya argumen yang dicetak ke formatf string tidak lagi menjadi masalah karena std :: ostream doesn ' t perlu format string.

Perbedaan kecepatan sepenuhnya tergantung pada implementasi, tetapi std :: cout memiliki kemampuan untuk lebih cepat daripada mencetak melalui inlining.