'printf' vs. 'cout' in C++

后端 未结 16 1577
梦如初夏
梦如初夏 2020-11-22 07:04

What is the difference between printf() and cout in C++?

16条回答
  •  遇见更好的自我
    2020-11-22 07:17

    Of course you can write "something" a bit better to keep maintenance:

    #include 
    #include 
    
    using namespace std;
    
    class Something
    {
        public:
            Something(int x, int y, int z) : a(x), b(y), c(z) { }
            int a;
            int b;
            int c;
    
            friend ostream& operator<<(ostream&, const Something&);
    
            void print() const { printf("%i, %i, %i\n", a, b, c); }
    };
    
    ostream& operator<<(ostream& o, const Something& s)
    {
        o << s.a << ", " << s.b << ", " << s.c;
        return o;
    }
    
    int main(void)
    {
        Something s(3, 2, 1);
    
        // Output with printf
        s.print(); // Simple as well, isn't it?
    
        // Output with cout
        cout << s << endl;
    
        return 0;
    }
    

    And a bit extended test of cout vs. printf, added a test of 'double', if anyone wants to do more testing (Visual Studio 2008, release version of the executable):

    #include 
    #include 
    #include 
    
    class TimedSection {
        char const *d_name;
        //timespec d_start;
        clock_t d_start;
    
        public:
            TimedSection(char const *name) :
                d_name(name)
            {
                //clock_gettime(CLOCK_REALTIME, &d_start);
                d_start = clock();
            }
            ~TimedSection() {
                clock_t end;
                //clock_gettime(CLOCK_REALTIME, &end);
                end = clock();
                double duration = /*1e3 * (end.tv_sec - d_start.tv_sec) +
                                  1e-6 * (end.tv_nsec - d_start.tv_nsec);
                                  */
                                  (double) (end - d_start) / CLOCKS_PER_SEC;
    
                std::cerr << d_name << '\t' << std::fixed << duration * 1000.0 << " ms\n";
            }
    };
    
    
    int main() {
        const int iters = 1000000;
        char const *text = "01234567890123456789";
        {
            TimedSection s("cout with only endl");
            for (int i = 0; i < iters; ++i)
                std::cout << std::endl;
        }
        {
            TimedSection s("cout with only '\\n'");
            for (int i = 0; i < iters; ++i)
                std::cout << '\n';
        }
        {
            TimedSection s("printf with only '\\n'");
            for (int i = 0; i < iters; ++i)
                printf("\n");
        }
        {
            TimedSection s("cout with string constant and endl");
            for (int i = 0; i < iters; ++i)
                std::cout << "01234567890123456789" << std::endl;
        }
        {
            TimedSection s("cout with string constant and '\\n'");
            for (int i = 0; i < iters; ++i)
                std::cout << "01234567890123456789\n";
        }
        {
            TimedSection s("printf with string constant and '\\n'");
            for (int i = 0; i < iters; ++i)
                printf("01234567890123456789\n");
        }
        {
            TimedSection s("cout with some stuff and endl");
            for (int i = 0; i < iters; ++i)
                std::cout << text << "01234567890123456789" << i << std::endl;
        }
        {
            TimedSection s("cout with some stuff and '\\n'");
            for (int i = 0; i < iters; ++i)
                std::cout << text << "01234567890123456789" << i << '\n';
        }
        {
            TimedSection s("printf with some stuff and '\\n'");
            for (int i = 0; i < iters; ++i)
                printf("%s01234567890123456789%i\n", text, i);
        }
        {
            TimedSection s("cout with formatted double (width & precision once)");
            std::cout << std::fixed << std::scientific << std::right << std::showpoint;
            std::cout.width(8);
            for (int i = 0; i < iters; ++i)
                std::cout << text << 8.315 << i << '\n';
        }
        {
            TimedSection s("cout with formatted double (width & precision on each call)");
            std::cout << std::fixed << std::scientific << std::right << std::showpoint;
    
            for (int i = 0; i < iters; ++i)
                { std::cout.width(8);
                  std::cout.precision(3);
                  std::cout << text << 8.315 << i << '\n';
                }
        }
        {
            TimedSection s("printf with formatted double");
            for (int i = 0; i < iters; ++i)
                printf("%8.3f%i\n", 8.315, i);
        }
    }
    

    The result is:

    cout with only endl    6453.000000 ms
    cout with only '\n'    125.000000 ms
    printf with only '\n'    156.000000 ms
    cout with string constant and endl    6937.000000 ms
    cout with string constant and '\n'    1391.000000 ms
    printf with string constant and '\n'    3391.000000 ms
    cout with some stuff and endl    9672.000000 ms
    cout with some stuff and '\n'    7296.000000 ms
    printf with some stuff and '\n'    12235.000000 ms
    cout with formatted double (width & precision once)    7906.000000 ms
    cout with formatted double (width & precision on each call)    9141.000000 ms
    printf with formatted double    3312.000000 ms
    

提交回复
热议问题