在并发程序中调用coutprintf()时可以发现它们的微小差异

多个线程同时打印时,cout的打印通常是混乱的,而printf()的打印总是完整的

例如:并发打印以下内容

1
2
This is Task A
Here is Task B

cout可能会打印成这样

1
ThiHere is is Ta Task Bsk A

而printf()总是完整地打印

1
2
This is Task A
Here is Task B

C++cout是基于流(Stream)实现的

C++最常用的头文件<iostream>定义了ostreamistream两个流,cout是ostream流的全局对象

cout内部具有缓冲机制,要输出至标准输出的数据先写入cout对象内部的缓冲区,当缓冲区满时或手动刷新时会输出。

cout默认为行缓冲,endl也会使缓冲区清空,这个行为也会消耗一定的性能。

基于其特性,cout并不是一次性将所有内容输出完的,所以不适合在并发输出环境使用。并且这个因素也会使cout的性能有所降低。

printf()会将处理后的字符串一起打印到屏幕上,不会出现混乱。

在Linux/Unix系统,coutprintf()都是通过write()将数据写入STDOUT_FILENO来实现输出效果的。