在我的 gcc-4.8.1 上,我使用两个命令编译了以下程序:
g++ -Wfatal-errors -std=c++11 -Wall -Werror test.cpp -o test -g
g++ -Wfatal-errors -std=c++11 -Wall -Werror test.cpp -o test -O3 -g
第一个可执行文件具有预期的输出,但第二个可执行文件有段错误。问题是很难调试,因为-O3
与代码混淆太多以至于-g
调试信息无法保留意义,因此gdb
在翻译源代码中发生的事情时遇到了麻烦。所以,我开始插入打印语句。正如我所料,打印语句改变了结果。使用调试打印,它工作得很好!
这是我的表达式模板源:
//test.cpp
#include <vector>
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef vector<int> Valarray;
template<typename L, typename R>
struct BinOpPlus {
const L& left;
const R& right;
BinOpPlus(const L& l, const R& r)
: left(l), right(r)
{}
int operator[](int i) const {
int l = left[i];
//cerr << "Left: " << l << endl; //uncomment to fix segfault
int r = right[i];
//cerr << "Right: " << r << endl; //uncomment to fix segfault
return l + r;
}
};
template<typename L, typename R>
BinOpPlus<L, R> operator+(const L& left, const R& right){
return BinOpPlus<L, R>(left, right);
}
int main() {
//int size = 10000000;
int size = 10;
Valarray v[3];
for(int n=0; n<3; ++n){
for(int i=0; i<size; ++i){
int val = rand() % 100;
v[n].push_back(val);
}
}
auto out = v[0] + v[1] + v[2];
int sum = 0;
for(int i=0; i<size; ++i){
cerr << "Checkpoint!" << endl;
sum += out[i]; //segfaults here
cerr << "Sum: " << sum << endl;
}
cout << "Sum: " << sum << endl;
return 0;
}
很久-O3
没有给我一个不正确/不可靠的二进制文件了。我首先假设我在代码中做错了什么,但还不足以-O0
显示它。有人知道我做错了什么吗?