メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

std::endl によって不要なフラッシュが生じることがあります

std::endl がより効率的な \n の代わりに使用される

説明

この欠陥は、I/O 操作での std::endl の使用にフラグを設定し、より効率的な代替手段の \n を使用できるようにします。

リスク

std::endl は、改行 (\n) に続けてフラッシュ操作を挿入します。次に例を示します。

std::cout << "Some content" << std::endl;
は、以下と等価です。
std::cout << "Some content" << '\n' << std::flush;
暗黙的フラッシュ操作は必要または意図的ではない可能性があります。プログラムに std::endl を使用する複数の I/O 操作が含まれている場合は、暗黙的フラッシュ操作でプログラムのパフォーマンスが大幅に低下する可能性があります。フラッシュ操作は暗黙的なため、パフォーマンスの問題がある場合は、問題の根本原因を追跡することが困難になります。

修正方法

\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 がループで使用されます。ループの繰り返しが 100,000 回の場合は、暗黙的フラッシュ操作ごとにわずかな遅延が生じ、それが積み重なって大幅なパフォーマンスの低下につながる可能性があります。

\n の使用とフラッシュの回避

繰り返しが数回のループでは、std::endl の代わりに \n を使用することによって、I/O 操作でのパフォーマンスの低下を回避します。

#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
影響度: Low

バージョン履歴

R2020a で導入