#include <iostream>
#include <cstdint>
#include <algorithm>
using namespace std;
union structA{
uint8_t mem[3];
struct{
unsigned field1 : 8;
unsigned field2 : 12;
unsigned field3 : 4;
};
};
struct structB{
uint8_t mem[10];
};
int main() {
cout << "Infos:"<<endl;
cout << " Alignment constraint of structA: "<<alignof(structA)<<endl;
cout << " Alignment constraint of uint8_t: "<<alignof(uint8_t)<<endl;
cout << " Size : "<<sizeof(structA)<<endl;
cout << " Is trivially copyable: "<<is_trivially_copyable<structA>::value<<endl;
structA ia; // test object
ia.field1 =7; ia.field2=911; ia.field3=5;
uint8_t globalMem[128];
fill( globalMem, globalMem +sizeof(globalMem), 0);
structA *pa = new (globalMem+10) structA(ia); // placement new to properly create object
structA a1 = *reinterpret_cast<structA*>(&globalMem[0]);
structA a2 = *reinterpret_cast<structA*>(&globalMem[10]);
structB b1 = *reinterpret_cast<structB*>(&globalMem[30]);
cout <<endl<<"Test:"<<endl;
cout << " original: "<<ia.field1<<" "<<ia.field2<<" "<<ia.field3<<endl;
cout << " copy: " <<a2.field1<<" "<<a2.field2<<" "<<a2.field3<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnVuaW9uIHN0cnVjdEF7CiAgdWludDhfdCBtZW1bM107CgogIHN0cnVjdHsKICAgIHVuc2lnbmVkIGZpZWxkMSA6IDg7CiAgICB1bnNpZ25lZCBmaWVsZDIgOiAxMjsgCiAgICB1bnNpZ25lZCBmaWVsZDMgOiA0OwogIH07Cn07CgpzdHJ1Y3Qgc3RydWN0QnsKICB1aW50OF90IG1lbVsxMF07Cn07CgoKaW50IG1haW4oKSB7CgkKCWNvdXQgPDwgIkluZm9zOiI8PGVuZGw7IAogICAgY291dCA8PCAiICBBbGlnbm1lbnQgY29uc3RyYWludCBvZiBzdHJ1Y3RBOiAiPDxhbGlnbm9mKHN0cnVjdEEpPDxlbmRsOwogICAgY291dCA8PCAiICBBbGlnbm1lbnQgY29uc3RyYWludCBvZiB1aW50OF90OiAiPDxhbGlnbm9mKHVpbnQ4X3QpPDxlbmRsOwoJY291dCA8PCAiICBTaXplIDogIjw8c2l6ZW9mKHN0cnVjdEEpPDxlbmRsOwoJY291dCA8PCAiICBJcyB0cml2aWFsbHkgY29weWFibGU6ICI8PGlzX3RyaXZpYWxseV9jb3B5YWJsZTxzdHJ1Y3RBPjo6dmFsdWU8PGVuZGw7IAoKCXN0cnVjdEEgaWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IG9iamVjdAoJaWEuZmllbGQxID03OyBpYS5maWVsZDI9OTExOyBpYS5maWVsZDM9NTsgIAoJCgl1aW50OF90IGdsb2JhbE1lbVsxMjhdOyAgIAoJZmlsbCggZ2xvYmFsTWVtLCBnbG9iYWxNZW0gK3NpemVvZihnbG9iYWxNZW0pLCAwKTsgICAgIAoJCglzdHJ1Y3RBICpwYSA9IG5ldyAoZ2xvYmFsTWVtKzEwKSBzdHJ1Y3RBKGlhKTsgICAvLyBwbGFjZW1lbnQgbmV3IHRvIHByb3Blcmx5IGNyZWF0ZSBvYmplY3QKCQoJc3RydWN0QSBhMSA9ICpyZWludGVycHJldF9jYXN0PHN0cnVjdEEqPigmZ2xvYmFsTWVtWzBdKTsKCXN0cnVjdEEgYTIgPSAqcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3RBKj4oJmdsb2JhbE1lbVsxMF0pOwoJc3RydWN0QiBiMSA9ICpyZWludGVycHJldF9jYXN0PHN0cnVjdEIqPigmZ2xvYmFsTWVtWzMwXSk7CgkKCWNvdXQgPDxlbmRsPDwiVGVzdDoiPDxlbmRsOwoJY291dCA8PCAiICBvcmlnaW5hbDogIjw8aWEuZmllbGQxPDwiICI8PGlhLmZpZWxkMjw8IiAiPDxpYS5maWVsZDM8PGVuZGw7IAoJY291dCA8PCAiICBjb3B5OiAgICAgIiA8PGEyLmZpZWxkMTw8IiAiPDxhMi5maWVsZDI8PCIgIjw8YTIuZmllbGQzPDxlbmRsOyAKCQoJcmV0dXJuIDA7Cn0=