Который быстрее, и который более гибкий: printf или cout?

Возможные дубликаты:
printf vs cout в С++
cin или printf?

Я всегда задавался вопросом о printf и cout.., который в конечном счете быстрее, и является ли он наиболее гибким (т.е. может печатать диапазон переменных, а вывод может быть отформатирован)?

P.S. Я знаю, что это похоже на 'printf' vs. 'cout' в С++, но я действительно не спрашиваю одно и то же.

Ответ 1

Краткий ответ

Быстрее: printf

Более гибкий: cout

Длинный ответ

По сравнению с семейством sprintf потоки С++ должны быть более медленными (в 6 раз, если я вспомню элемент Exceptional С++, Herb Sutter). Тем не менее, большую часть времени вам не нужна эта скорость, но вы должны быть уверены, что ваш код не будет прослушиваться.

И легко сделать что-то не так с семейством функций printf, будь то неправильное количество аргументов, неправильные типы или даже ввести потенциальную уязвимость безопасности (спецификатор% n приходит в голову) в вашем коде.

Если это действительно не нужно (а потом, это называется саботаж), почти невозможно ошибиться с потоками С++. Они легко обрабатывают все известные типы (встроенные, std:: строки и т.д.), И его легко расширить. Например, допустим, у меня есть объект "Coordinate3D", и я хочу распечатать его данные:

#include <iostream>

struct Coordinate3D
{
    int x ;
    int y ;
    int z ;
} ;

std::ostream & operator << (std::ostream & p_stream
                          , const Coordinate3D & p_c)
{
    return p_stream << "{ x : " << p_c.x
                   << " , y : " << p_c.y
                   << " , z : " << p_c.z << " }" ;
}

int main(int argc, char * argv[])
{
    Coordinate3D A = {25,42,77} ;
    std::cout << A << std::endl ;
          // will print "{ x : 25 , y : 42 , z : 77 }"
    return 0 ;
}

Проблема с потоком заключается в том, что их довольно сложно правильно обрабатывать, когда вы хотите указать формат некоторых данных (например, пробелы для чисел), и иногда вам действительно нужно идти быстро. Затем вернитесь к printf или попробуйте использовать некоторые высокоскоростные альтернативы С++ (FastFormat).

Изменить: Обратите внимание, что серия тестов Thomas показывает интересные результаты (которые я воспроизвел прямо сейчас на своем компьютере), то есть: cout и printf имеют схожие характеристики, когда один из них избегает использования std::endl (который очищает вывод в дополнение к выводу \n).

Ответ 2

  • Быстрее: printf
  • Больше типов и расширений: cout
  • Лучше: зависит! Мне нравится printf больше.

Я не одинок, думая, что способ С++ cout делает форматирование просто эпическим провалом.