//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;
}
Ci8vdGVzdC5jcHAKI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiB2ZWN0b3I8aW50PiBWYWxhcnJheTsKCnRlbXBsYXRlPHR5cGVuYW1lIEwsIHR5cGVuYW1lIFI+CnN0cnVjdCBCaW5PcFBsdXMgewogIGNvbnN0IEwgbGVmdDsKICBjb25zdCBSIHJpZ2h0OwoKICBCaW5PcFBsdXMoY29uc3QgTCYgbCwgY29uc3QgUiYgcikKICAgIDogbGVmdChsKSwgcmlnaHQocikKICB7fQoKICBpbnQgb3BlcmF0b3JbXShpbnQgaSkgY29uc3QgeyAKICAgIGludCBsID0gbGVmdFtpXTsKICAgIC8vY2VyciA8PCAiTGVmdDogIiA8PCBsIDw8IGVuZGw7IC8vdW5jb21tZW50IHRvIGZpeCBzZWdmYXVsdAogICAgaW50IHIgPSByaWdodFtpXTsKICAgIC8vY2VyciA8PCAiUmlnaHQ6ICIgPDwgciA8PCBlbmRsOyAvL3VuY29tbWVudCB0byBmaXggc2VnZmF1bHQKICAgIHJldHVybiBsICsgcjsKICB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBMLCB0eXBlbmFtZSBSPgpCaW5PcFBsdXM8TCwgUj4gb3BlcmF0b3IrKGNvbnN0IEwmIGxlZnQsIGNvbnN0IFImIHJpZ2h0KXsKICByZXR1cm4gQmluT3BQbHVzPEwsIFI+KGxlZnQsIHJpZ2h0KTsKfQoKaW50IG1haW4oKSB7CiAgLy9pbnQgc2l6ZSA9IDEwMDAwMDAwOwogIGludCBzaXplID0gMTA7CiAgVmFsYXJyYXkgdlszXTsKICBmb3IoaW50IG49MDsgbjwzOyArK24pewogICAgZm9yKGludCBpPTA7IGk8c2l6ZTsgKytpKXsKICAgICAgaW50IHZhbCA9IHJhbmQoKSAlIDEwMDsKICAgICAgdltuXS5wdXNoX2JhY2sodmFsKTsKICAgIH0KICB9CgogIGF1dG8gb3V0ID0gdlswXSArIHZbMV0gKyB2WzJdOyAKCiAgaW50IHN1bSA9IDA7CiAgZm9yKGludCBpPTA7IGk8c2l6ZTsgKytpKXsKICAgIGNlcnIgPDwgIkNoZWNrcG9pbnQhIiA8PCBlbmRsOwogICAgc3VtICs9IG91dFtpXTsgLy9zZWdmYXVsdHMgaGVyZQogICAgY2VyciA8PCAiU3VtOiAiIDw8IHN1bSA8PCBlbmRsOwogIH0KCiAgY291dCA8PCAiU3VtOiAiIDw8IHN1bSA8PCBlbmRsOwogIHJldHVybiAwOwp9IA==