为什么 MSVC STL 不实现 sync_with_stdio()?

Why does MSVC STL not implement sync_with_stdio()?

提问人:Alcatraz 提问时间:7/14/2022 最后编辑:StoryTeller - Unslander MonicaAlcatraz 更新时间:7/15/2022 访问量:143

问:

我在 github 上的 MSVC STL 源代码中查找了此函数的实现,但除了设置同步标志外没有找到任何代码。

接下来,我编写了一个简单的程序,调用了这个函数,并在调试器下运行它,希望能找到这个标志地址的读数。但是在程序运行期间,除了函数本身之外,没有任何东西会读取此标志。

为什么 Microsoft 没有实现此功能?

之后,我去了cppreference ,对函数的详细描述感到惊讶。这些信息从何而来?原来 cppreference 示例中使用了 GCC,我去看了 libstdc++ 源代码,在那里我发现这个函数是完全实现的。

为什么Microsoft决定这样做?也许他们的目标是确保 I/O 流的安全性和完全同步?

visual-c++ c++-标准库

评论


答:

1赞 Cubbi 7/15/2022 #1

就标准而言,“设置同步标志”并返回旧的标记是它应该做的所有事情:https://eel.is/c++draft/ios.base#ios.members.static-1

否则,如果使用 false 参数调用,则允许标准流独立于标准 C 流运行。

“允许”并不意味着“应”。它只是意味着如果你没有用 调用它,则不允许库缓冲。false

Cppreference 说同样 https://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio

如果关闭同步,则允许 C++ 标准流独立缓冲其 I/O

Microsoft 这里这里的 LLVM 没有使用允许值,而只是更新了未以其他方式使用的静态布尔标志值。GNU libstdc++ 是一个当前的实现,它更进一步,在这里为不同步的 C++ 流提供了自己的缓冲区