gpt4 book ai didi

c++ - std::ios_base::sync_with_stdio 如何影响流缓冲?

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:38 25 4
gpt4 key购买 nike

两者都是this answer关于 Stack Overflow 和 cppreference.com建议关闭流同步以提高性能,认为流同步会禁用缓冲。

这就是我不明白的地方。为什么同步流不能简单地共享缓冲区?我想象如果流是同步的,std::fputc(stdout, c);可以简单地根据 std::cout << c; 来实现或者反过来(或使用通用原语)。因此,每当 C I/O 与 C++ I/O 混合时,同步流甚至比非同步流更有优势!更少的缓冲区,更少的缓存未命中。

当前的 C++ 标准草案似乎与我同在。在脚注中 sync_with_stdio()被指定,它说“实际上,同步通常意味着一个标准的 iostream 对象和一个标准的 stdio 对象共享一个缓冲区。”我在上面发布的链接是否可能仅记录了一些不完善的实现及其对性能的影响?

另外,因为我没有看到非同步流有任何理论上的缺点,所以我想知道为什么这些首先存在。

最佳答案

std::fputc(stdout, c); could simply be implemented in terms of std::cout << c; or the other way round (or using a common primitive)

其实是“反过来”。同步 std::cout是一个无缓冲的流,每个 std::cout << c;立即执行 std::fputc(stdout, c); .

synchronized streams would even have an advantage over non-synchronized ones! Fewer buffers, fewer cache misses

这两种方式都只是一个缓冲区:stdout是同步时或 std::cout不是的时候。在我的 gcc/libstdc++ 上,主要区别在于一个是 1024 字节,另一个是 8191(严重)。剖析标准库的三个现有实现(libstdc++、libc++ 和 MSVC)以发现差异及其原因可能很有趣。很可能它们是“不完美的实现”——没有理由不同步 std::cout << c;应该比(始终同步)std::fputc(stdout, c); 慢.

关于c++ - std::ios_base::sync_with_stdio 如何影响流缓冲?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49238440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com