C++ 理解缓冲区和 std::endl

时间:2021-05-21 05:42:29

标签: c++

我试图了解缓冲区、endl 与 \n 以及为什么后者比 endl 更有效。

具体来说,我正在阅读这个 https://www.geeksforgeeks.org/buffer-flush-means-c/

下面的代码应该是一次输出1,2,3,4,5

#include <iostream>
#include <windows.h>
using namespace std;


int main()
{
   for (int i = 1; i <= 5; ++i)
   {
      cout << i << " " ;
     Sleep(300);
   }
     cout << endl;

   return 0;
}

而以下将一次输出一个整数:

#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
   for (int i = 1; i <= 5; ++i)
   {
      cout << i << " " << flush;
      Sleep(300);
   }
   return 0;
}

然而,两者在执行时看起来完全一样,它们一次出现一个。我的理解有误吗?

我也很困惑为什么与 \n 相比,endl 的效率较低。

从我读到的,endl 添加了一个 \n 然后刷新。

与 \n 相比,这不是更有效,因为它等待缓冲区已满然后立即输出所有内容吗?

请纠正我的错误理解,谢谢。

1 个答案:

答案 0 :(得分:0)

如果您运行以下代码,您将清楚地看到区别:

#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
   for (int i = 1; i <= 5; ++i)
   {
      cout << i << " " << flush;
      usleep(300000);
   }
   cout<<"\n";
   for (int i = 1; i <= 5; ++i)
   {
      cout << i << " " ;
     usleep(300000);
   }
    cout << endl;
     
   return 0;
}

std::endl 等价于使用 "\n" 并齐平。

如果您的程序稳定,那么只需使用“\n”,否则使用 std::endl。 "\n" 更有效,因为它不会强制立即刷新缓冲区。

同样在您的代码中,您现在可能会看到差异,因为您使用的是 Sleep() 以毫秒为单位接收输入,因此请尝试使用更大的值。