【问题标题】:Why std::ios_base::sync_with_stdio isn't implemented in libc++ (clang)?为什么 std::ios_base::sync_with_stdio 没有在 libc++ (clang) 中实现?
【发布时间】:2016-02-23 13:41:28
【问题描述】:

让我们看一下这个代码示例:

#include <iostream>

int main() {
    std::ios_base::sync_with_stdio(false);

    int n;
    std::cin >> n;
    for (int i = 0; i < n; ++i) {
        int buf;
        std::cin >> buf;
    }
}

此代码示例在这样的输入上的性能:

10000000
0
1
...
9999999

在我的机器上:

g++-5 -O2 -std=c++11:

./a.out < input.txt  0.86s user 0.07s system 98% cpu 0.942 total

clang-700.0.72 -O2 -std=c++11

./a.out < input.txt  38.69s user 0.21s system 99% cpu 39.248 total

经过一些分析后,我发现 libc++ 根本没有禁用同步。

然后我查看了他们的代码,发现: https://github.com/llvm-mirror/libcxx/blob/6a85e8a355be05b9efa8408f875014e6b47cef3b/src/ios.cpp#L458

所以我的问题是,这是设计还是错误?

【问题讨论】:

  • 可以吗?你有什么问题?
  • 他可能会问它是否工作正常或是否存在错误。
  • 根据cppreference 如果在标准流上发生某些 I/O 后调用此函数是否有任何效果,则由实现定义。 虽然看起来没有在这里申请。
  • 就像“似乎工作”是未定义行为的有效形式一样,“似乎已同步”是“未同步”流行为的有效方式。符合要求。

标签: c++ performance c++11 clang libc++


【解决方案1】:

sync_with_stdio 只是一个咨询功能,据我所知。

ios.members.static/2 说:

效果:如果在调用之前使用标准流发生了任何输入或输出操作,则效果是实现定义的。否则,使用错误参数调用,它允许标准流独立于标准 C 流运行。

“允许......独立操作”是关键,恕我直言。

对实现没有要求实际上这样做,而是禁止这样做除非这个调用已经进行。

所以,是的,这是符合规范的行为。

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多