【发布时间】: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++