为什么在libc ++(clang)中没有实现std :: ios_base :: sync_with_stdio?

时间:2015-11-20 22:48:52

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

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

#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

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

1 个答案:

答案 0 :(得分:4)

就我所知,

sync_with_stdio只是一个咨询功能。

ios.members.static / 2说:

  

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

&#34;允许......独立运作&#34;是关键,恕我直言。

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

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