#include <iostream>
#include <vector>
struct Value
{
int x;
};
struct Delta
{
int dx;
};
void apply(std::vector<Value> & values, const Delta & delta)
{
for (unsigned i = 0; i < values.size(); i++)
{
values[i].x += delta.dx;
}
}
int main()
{
std::vector<Value> values(2);
Delta & d = reinterpret_cast<Delta&>(values[0]);
d.dx = 1;
apply(values, d);
std::cout << values[1].x << std::endl;
}
// My results with GCC 4.6.3
#if 0
$ g++ -o test -O0 main.cpp && ./test
2
$ g++ -o test -O1 main.cpp && ./test
2
$ g++ -o test -O2 main.cpp && ./test
1
$ g++ -o test -O3 main.cpp && ./test
1
#endif
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IFZhbHVlCnsKICAgIGludCB4Owp9OwoKc3RydWN0IERlbHRhCnsgICAgICAgCiAgICBpbnQgZHg7Cn07Cgp2b2lkIGFwcGx5KHN0ZDo6dmVjdG9yPFZhbHVlPiAmIHZhbHVlcywgY29uc3QgRGVsdGEgJiBkZWx0YSkKewogICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICB2YWx1ZXNbaV0ueCArPSBkZWx0YS5keDsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxWYWx1ZT4gdmFsdWVzKDIpOwogICAgCiAgICBEZWx0YSAmIGQgPSByZWludGVycHJldF9jYXN0PERlbHRhJj4odmFsdWVzWzBdKTsKICAgIGQuZHggPSAxOwogICAgCiAgICBhcHBseSh2YWx1ZXMsIGQpOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgdmFsdWVzWzFdLnggPDwgc3RkOjplbmRsOwp9CgovLyBNeSByZXN1bHRzIHdpdGggR0NDIDQuNi4zCiNpZiAwCiAgICAkIGcrKyAtbyB0ZXN0IC1PMCBtYWluLmNwcCAmJiAuL3Rlc3QKICAgIDIKIAogICAgJCBnKysgLW8gdGVzdCAtTzEgbWFpbi5jcHAgJiYgLi90ZXN0CiAgICAyCiAKICAgICQgZysrIC1vIHRlc3QgLU8yIG1haW4uY3BwICYmIC4vdGVzdAogICAgMQogCiAgICAkIGcrKyAtbyB0ZXN0IC1PMyBtYWluLmNwcCAmJiAuL3Rlc3QKICAgIDEKI2VuZGlm