exponenta event banner

std::endl может вызвать ненужный смыв

std::endl используется вместо более эффективного \n

Описание

Этот дефект флагов использует std::endl в операциях ввода-вывода и позволяет использовать более эффективную альтернативу, \n.

Риск

std::endl вставляет новую строку (\n) с последующей операцией промывки. Например:

std::cout << "Some content" << std::endl;
эквивалентно:
std::cout << "Some content" << '\n' << std::flush;
Неявная операция очистки может быть необязательной или предполагаемой. Если в вашей программе много операций ввода-вывода, которые используют std::endl, неявная операция очистки может значительно снизить производительность программы. Поскольку операция очистки является неявной, в случае проблемы с производительностью будет трудно отследить основную причину проблемы.

Зафиксировать

Использовать \n для ввода новой строки, где это возможно.

Если требуется операция промывки, вместо std::endl, использовать \n после чего следует явная операция очистки, например:

std::cout << "Some content" << '\n' << std::flush;
В этом случае анализ рассматривает использование операции смыва как преднамеренное и не помечает использование.

Повышение производительности может зависеть от используемого компилятора, реализации библиотеки и среды.

Примеры

развернуть все

#include <fstream> 
using namespace std; 

int main() 
{ 
  ofstream aFile("file.txt"); 
  for ( int i = 0; i < 100000; i++) { 
    aFile << "Hello World " << std::endl ; 
  } 
  aFile.close();
  return 0; 
} 

В этом примере std::endl используется в цикле во время операции записи в файл. Поскольку цикл имеет 100000 итераций, небольшая задержка от каждой неявной операции очистки может привести к значительному снижению производительности.

Использовать \n и избегайте заподлицо

В цикле с несколькими итерациями избегайте снижения производительности операций ввода-вывода с помощью \n вместо std::endl.

#include <fstream> 
using namespace std; 

int main() 
{ 
  ofstream aFile("file.txt"); 
  for ( int i = 0; i < 100000; i++) { 
    aFile << "Hello World \n" ; 
  } 
  aFile.close(); 
  return 0; 
} 

Информация о результатах

Группа: Производительность
Язык: C++
По умолчанию: Откл.
Синтаксис командной строки: STD_ENDL_USE
Воздействие: Низкий
Представлен в R2020a