-O2 优化不会在读取大文件时出圈
-O2 optimization does not go out of the loop if reading large file
我对GCC(G++(编译器有一个非常奇怪的问题。我的C++代码如下所示。
int main() {
ifstream ifsr("some-large-file.bin", ios::binary | ios::in);
for (int i = 0; i < 50000; i++) {
ifsr.seekg(60000 * i);
if (i % 1000 == 0) cout << i << "n";
}
ifsr.close();
return 0;
}
它应该在i >= 50000
后停止.但是,如果我使用 -O2
或 -O3
选项编译代码,循环不会停止(它继续迭代,即使i > 50000
(。如果我使用-O
选项编译它,它会很好地工作。如果我注释掉ifsr.seekg(60000 * i);
行,那也很好用(即使有-O2
和-O3
选项(。我还在我的AWS实例(EC2 c3.2xlarge和Ubuntu 16.42(中测试了代码,它显示了类似的行为。(我正在为 Windows 10 使用 bash(。
我不知道这段代码中到底发生了什么。如果有一个解决方案可以在不丢弃-O2
或-O3
选项的情况下运行类似的代码,那就太好了!谢谢。
49999*60000 = 2,999,940,000
溢出通常的 32 位有符号int
。这是未定义的行为,应该是问题的根源。
例如,允许优化器假定i
永远不会大于(2^31 - 1) / 60000
,因为它可以假设 UB 永远不会发生,并且根据该逻辑,循环条件始终为真。(可能是也可能不是确切发生的事情,UB可以通过各种方式破坏事物。
请改用int64_t i
。
相关文章:
- 正在将csv文件读取为双精度矢量
- 将从格式化文本文件读取的文本数据存储到链表
- C++ 读取文件读取文件不正确
- 使用对象文件读取三角形数据网格
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 从文件读取,并写入函数C++中的数组
- 从对象C++中的文件读取内容时出现分段错误
- 从文件读取并通过矢量输出到控制台
- 尝试将字符串从文件读取到无符号字符向量中
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 简化文件读取的函数
- 如何将逗号分隔的文件读取为 2D int 数组?
- 在 c++ 中将数据从文件读取到队列中
- 'std::wstring_convert'尽可能多地转换(从 UTF8 文件读取块)
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 文件读取C++包括空格键
- 从文件读取时未将值推回矢量
- 从文件 C++ 读取时的无限循环
- 从同一文件读取和写入?
- 从.txt文件读取到C++中的双精度向量