printf和cout区别

sta::cout:
The global objects std::cout and std::wcout control output to a stream buffer ofimplementation-defined type (derived from std:streambuf), associated with thestandard C output stream stdout.
printf:
Loads the data from the qiven locations, converts them to character string equivalentsand writes the results to a variety of sinks

 std..cout, std:cin 是全局对象, operator << 和 operator >> 是流运算符,std::cout 重载了<< 运算符,std::cin 重载了运算符

printf 是函数
说 printf 速度比 cout 要快,这个其实是不对的,我们看上面std::cout 解释的最后一句,std::cout 是默认与C标准输出stdout 同步的(std.cin 同理),所以会有额外的运算C++ 提供了 std.:ios base:sync with stdio 这样一个函数来设置是否同步,但是关闭了同步之后可能会出现错误.
然而,我们在看 cin 的说明

Once std::cin is constructed, std..cin.tiel) returns &std.cout, and likewise, std::wcin.tiel)returns &std::wcout. This means that any formatted input operation on std::cin forces acall to std::cout.flush0 if any characters are pending for output.

cin 被预设绑定了 cout, 被绑定的 ostream 在istream 输入会被 flush,标准库提供了std::cin.tie0设置绑定对象
说到这了,顺便说一下 std.:endl 这个东西, 可以说等价于<<'\n' << flush, 所做的事情就是清空缓冲区并输出到输出流.上面说到了 std::cout 会把输出放到一个叫缓冲区(stream buffer%) 里,直到缓冲区满了才会清空缓冲区并把字串输出到 stdout 之类的输出流,这也就是为什么关闭了缓冲区可能会出现错误.那么说到这里也就整明白了,如果频察使用 std::endl 来做换行输出,那便是破坏了std:cout 本身的类似于优化的操作, 也就导致了通常认为 std::cout 的速度比 printf慢.
这也就很好的解释 leetcode 中经常看到的一段加速代码

static const int _ = []{
   ios::sync with stdio(false);
   cin.tie(nullptr);
   return 0;
} ();

在C++标准中,`std::cout` 是标准输出流对象,而不是一个线程安全的对象。多个线程同时写入到 `std::cout` 可能会导致输出的混乱或损坏。这是因为 `std::cout` 是一个全局对象,所有线程共享同一个输出流。

与此不同,`printf` 是C标准库中的函数,而不是一个流对象。对于大部分平台来说,`printf` 在写入时是线程安全的,即多个线程同时调用 `printf` 函数不会导致输出的混乱。这是因为 `printf` 在内部使用了同步机制来保证输出的一致性。

然而,虽然 `printf` 是线程安全的,但如果多个线程同时输出到标准输出流,并且同时使用 `printf` 和 `std::cout` 进行输出,仍然可能导致输出的混乱,因为 `printf` 和 `std::cout` 并不知道彼此的存在,无法进行同步。

对于多线程环境下的输出操作,你可以使用线程安全的输出机制,如互斥锁(mutex)或其他同步机制来保证输出的正确性和一致性。例如,在使用 `std::cout` 进行输出时,可以在输出之前使用互斥锁保护它,确保同一时刻只有一个线程访问并输出到 `std::cout`。

总结起来,`std::cout` 在默认情况下不是线程安全的,而 `printf` 在大部分平台上是线程安全的。但无论使用哪种输出方式,在多线程环境下都需要采取适当的同步机制来确保输出操作的正确性。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值