تفاوت اساسی بین std :: cout و fprintf در C ++ چیست؟ آیا یکی بهتر یا سریعتر از دیگری؟


پاسخ 1:

با std :: cout ، اپراتور اضافه بار << برای آرگومان فراخوانی می شود ، در حالی که با fprintf آرگومان به یک رشته تبدیل می شود. با این حال ، منطق اساسی در پشت هر دو یکسان است.

cstdio با هماهنگ سازی فعال شده سریعتر است ، اما اگر هماهنگی را بین این دو غیرفعال کنید ، iostream سریعتر و در برخی موارد بسیار سریعتر خواهد بود. در کد خوب C ++ فقط باید از iostream استفاده شود. بنابراین ، می توانید همگام سازی را با تماس با std :: ios :: sync_with_stdio (نادرست) غیرفعال کنید.

توجه داشته باشید

برخلاف تصور عامه ، اجرای C ++ به دلیل بهینه‌سازی کامپایلر در صورت وجود همان عملکرد برای کتابخانه‌های C ++ و کتابخانه‌های C ، تقریباً همیشه بهتر است.


پاسخ 2:

بله ، std :: cout بهتر است. این یک std :: ostream است ، دقیقاً مانند std :: stringstream ، که شبیه به نسخه printf به نام sprintf است.

چندین مشکل در printf وجود دارد.

  1. از یک رشته فرمت استفاده می کند نه تنها برای نشان دادن چگونگی چاپ آرگومان های باقیمانده ، بلکه برای نشان دادن اینکه کدام نوع بر روی سیستم نوع تأثیر نمی گذارد تا کامپایلر انواع شیء مورد چاپ شما را نشناسد. برای رفع این مشکل ، کامپایلرهای جدیدتر C و C ++ سعی می کنند این رشته را در زمان کامپایل تفسیر کنند. این یک درمان خاص برای این عملکرد است. هیچ عملکردی نباید به درمان خاصی نیاز داشته باشد. Varargs استفاده می شود ، که نوع را پاک می کند. بنابراین اگر مشکل نباشد ، مشکل 1 کاملاً ضروری است.

برای std :: ostream، همانطور که برای std :: cout، عملگر << برای هر نوع که می خواهید چاپ کنید تعریف شده است و بیشتر آنها می توانند برای انجام این کار با اپراتور << برای انواع ابتدایی خود تماس بگیرند. هر تابع << از نوع عملکردی می داند و در زمان کامپایل کاملاً بی خطر است. بنابراین ، مشکل زمان اجرا که آرگومان های کافی به چاپ بر اساس رشته فرمت منتقل نمی شود ، دیگر از آنجایی که یک دستور std :: ostream ندارد ، دیگر مشکلی نیست. به یک رشته قالب نیاز ندارد.

اختلاف سرعت کاملاً به اجرای آن بستگی دارد ، اما std :: cout امکان سریعتر از printf را از طریق ورودی فراهم می کند.


پاسخ 3:

بله ، std :: cout بهتر است. این یک std :: ostream است ، دقیقاً مانند std :: stringstream ، که شبیه به نسخه printf به نام sprintf است.

چندین مشکل در printf وجود دارد.

  1. از یک رشته فرمت استفاده می کند نه تنها برای نشان دادن چگونگی چاپ آرگومان های باقیمانده ، بلکه برای نشان دادن اینکه کدام نوع بر روی سیستم نوع تأثیر نمی گذارد تا کامپایلر انواع شیء مورد چاپ شما را نشناسد. برای رفع این مشکل ، کامپایلرهای جدیدتر C و C ++ سعی می کنند این رشته را در زمان کامپایل تفسیر کنند. این یک درمان خاص برای این عملکرد است. هیچ عملکردی نباید به درمان خاصی نیاز داشته باشد. Varargs استفاده می شود ، که نوع را پاک می کند. بنابراین اگر مشکل نباشد ، مشکل 1 کاملاً ضروری است.

برای std :: ostream، همانطور که برای std :: cout، عملگر << برای هر نوع که می خواهید چاپ کنید تعریف شده است و بیشتر آنها می توانند برای انجام این کار با اپراتور << برای انواع ابتدایی خود تماس بگیرند. هر تابع << از نوع عملکردی می داند و در زمان کامپایل کاملاً بی خطر است. بنابراین ، مشکل زمان اجرا که آرگومان های کافی به چاپ بر اساس رشته فرمت منتقل نمی شود ، دیگر از آنجایی که یک دستور std :: ostream ندارد ، دیگر مشکلی نیست. به یک رشته قالب نیاز ندارد.

اختلاف سرعت کاملاً به اجرای آن بستگی دارد ، اما std :: cout امکان سریعتر از printf را از طریق ورودی فراهم می کند.


پاسخ 4:

بله ، std :: cout بهتر است. این یک std :: ostream است ، دقیقاً مانند std :: stringstream ، که شبیه به نسخه printf به نام sprintf است.

چندین مشکل در printf وجود دارد.

  1. از یک رشته فرمت استفاده می کند نه تنها برای نشان دادن چگونگی چاپ آرگومان های باقیمانده ، بلکه برای نشان دادن اینکه کدام نوع بر روی سیستم نوع تأثیر نمی گذارد تا کامپایلر انواع شیء مورد چاپ شما را نشناسد. برای رفع این مشکل ، کامپایلرهای جدیدتر C و C ++ سعی می کنند این رشته را در زمان کامپایل تفسیر کنند. این یک درمان خاص برای این عملکرد است. هیچ عملکردی نباید به درمان خاصی نیاز داشته باشد. Varargs استفاده می شود ، که نوع را پاک می کند. بنابراین اگر مشکل نباشد ، مشکل 1 کاملاً ضروری است.

برای std :: ostream، همانطور که برای std :: cout، عملگر << برای هر نوع که می خواهید چاپ کنید تعریف شده است و بیشتر آنها می توانند برای انجام این کار با اپراتور << برای انواع ابتدایی خود تماس بگیرند. هر تابع << از نوع عملکردی می داند و در زمان کامپایل کاملاً بی خطر است. بنابراین ، مشکل زمان اجرا که آرگومان های کافی به چاپ بر اساس رشته فرمت منتقل نمی شود ، دیگر از آنجایی که یک دستور std :: ostream ندارد ، دیگر مشکلی نیست. به یک رشته قالب نیاز ندارد.

اختلاف سرعت کاملاً به اجرای آن بستگی دارد ، اما std :: cout امکان سریعتر از printf را از طریق ورودی فراهم می کند.


پاسخ 5:

بله ، std :: cout بهتر است. این یک std :: ostream است ، دقیقاً مانند std :: stringstream ، که شبیه به نسخه printf به نام sprintf است.

چندین مشکل در printf وجود دارد.

  1. از یک رشته فرمت استفاده می کند نه تنها برای نشان دادن چگونگی چاپ آرگومان های باقیمانده ، بلکه برای نشان دادن اینکه کدام نوع بر روی سیستم نوع تأثیر نمی گذارد تا کامپایلر انواع شیء مورد چاپ شما را نشناسد. برای رفع این مشکل ، کامپایلرهای جدیدتر C و C ++ سعی می کنند این رشته را در زمان کامپایل تفسیر کنند. این یک درمان خاص برای این عملکرد است. هیچ عملکردی نباید به درمان خاصی نیاز داشته باشد. Varargs استفاده می شود ، که نوع را پاک می کند. بنابراین اگر مشکل نباشد ، مشکل 1 کاملاً ضروری است.

برای std :: ostream، همانطور که برای std :: cout، عملگر << برای هر نوع که می خواهید چاپ کنید تعریف شده است و بیشتر آنها می توانند برای انجام این کار با اپراتور << برای انواع ابتدایی خود تماس بگیرند. هر تابع << از نوع عملکردی می داند و در زمان کامپایل کاملاً بی خطر است. بنابراین ، مشکل زمان اجرا که آرگومان های کافی به چاپ بر اساس رشته فرمت منتقل نمی شود ، دیگر از آنجایی که یک دستور std :: ostream ندارد ، دیگر مشکلی نیست. به یک رشته قالب نیاز ندارد.

اختلاف سرعت کاملاً به اجرای آن بستگی دارد ، اما std :: cout امکان سریعتر از printf را از طریق ورودی فراهم می کند.