我正在尝试将 iostream 添加到遗留代码中,因此想要同步这两个库。根据这篇文章,我应该使用 std::ios_base::sync_with_stdio。
现在,我想知道它是如何在实践中使用的(请提供示例),我应该注意的副作用。
谢谢
默认情况下,流是同步的,保证按标准工作,您不必做任何事情。sync_with_stdio
如果您愿意,这里只是为了禁用同步。
从您提到的文章中:
对于预定义的流,混合 stdio 和 iostream 是安全的。例如,您可以在同一个程序中安全地使用 stdin 和 cin;C++ 标准保证它将按照您天真的期望的方式工作。
唯一的缺点是潜在的性能损失(我想这就是它可以被禁用的原因)。
正如 TheSamFrom1984 所说,同步是默认设置,所以它不应该是一个问题。但是,仅当两个库都在操作相同的流时,同步才相关。这通常在分别使用 cin/cout/cerr 和 stdin/stdout/stderr 时发生。但是,除了重用遗留代码之外,我看不出需要同时使用两者的原因。
当我第一次开始使用 C++ 时,我发现自己这样做是因为我经常知道如何使用 stdio 来做某事,但不知道如何使用 iostream 来做,但更好的方法是弄清楚如何在一个或其他,但不是两者兼而有之。
这是声明std::ios_base::sync_with_stdio()
:
static bool sync_with_stdio( bool sync = true );
它设置标准 C++ 流是否在每次输入/输出操作后与标准 C 流同步。
标准 C++ 流如下:std::cin
, std::cout
, std::cerr
, std::clog
, std::wcin
, std::wcout
,std::wcerr
和std::wclog
.
标准 C 流如下:stdin
、stdout
和stderr
.
实际上,这意味着同步的 C++ 流是无缓冲的,并且 C++ 流上的每个 I/O 操作都会立即应用于相应的 C 流的缓冲区。这使得自由混合 C++ 和 CI/O 成为可能。
此外,同步的 C++ 流保证是线程安全的(从多个线程输出的单个字符可能交错,但不会发生数据竞争)
如果关闭同步,则允许 C++ 标准流独立缓冲其 I/O,这在某些情况下可能会快得多。
默认情况下,所有八个标准 C++ 流都与其各自的 C 流同步。
如果在标准流上发生 I/O 之后调用此函数,则行为是实现定义的:实现范围从无效到破坏读取缓冲区。
例子:
#include <iostream>
#include <cstdio>
int main()
{
std::ios::sync_with_stdio(false);
std::cout << "a\n";
std::printf("b\n");
std::cout << "c\n";
}
输出:
b
a
c
资料来源:cppreference