#include <vector>
#include <iostream>
#include <assert.h>
#include <inttypes.h>
#include <stddef.h>
#include <memory.h>
struct MyStandardLayout {
char mem_a;
int16_t num_1;
int32_t num_2;
int64_t num_3;
char mem_z;
MyStandardLayout()
: mem_a('a')
, num_1(1 + (1 << 14))
, num_2(1 + (1 << 30))
, num_3(1LL + (1LL << 62))
, mem_z('z')
{ }
void print() const {
std::cout <<
"MySL Obj: " <<
mem_a << " / " <<
num_1 << " / " <<
num_2 << " / " <<
num_3 << " / " <<
mem_z << "\n";
}
};
void ZeroInts(MyStandardLayout* pObj) {
const size_t first = offsetof(MyStandardLayout, num_1);
const size_t third = offsetof(MyStandardLayout, num_3);
std::cout << "ofs(1st) = " << first << "\n";
std::cout << "ofs(3rd) = " << third << "\n";
assert(third > first);
const size_t delta = third - first;
std::cout << "delta = " << delta << "\n";
const size_t sizeAll = delta + sizeof(MyStandardLayout::num_3);
std::cout << "sizeAll = " << sizeAll << "\n";
std::vector<char> buf( sizeAll, 0 );
memcpy(&pObj->num_1, &buf[0], sizeAll);
}
int main()
{
MyStandardLayout obj;
obj.print();
ZeroInts(&obj);
obj.print();
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxpbnR0eXBlcy5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KCnN0cnVjdCBNeVN0YW5kYXJkTGF5b3V0IHsKCWNoYXIgbWVtX2E7CglpbnQxNl90IG51bV8xOwoJaW50MzJfdCBudW1fMjsKCWludDY0X3QgbnVtXzM7CgljaGFyIG1lbV96OwoKCU15U3RhbmRhcmRMYXlvdXQoKQoJOiBtZW1fYSgnYScpCgksIG51bV8xKDEgKyAoMSA8PCAxNCkpCgksIG51bV8yKDEgKyAoMSA8PCAzMCkpCgksIG51bV8zKDFMTCArICgxTEwgPDwgNjIpKQoJLCBtZW1feigneicpCgl7IH0KCgl2b2lkIHByaW50KCkgY29uc3QgewoJCXN0ZDo6Y291dCA8PCAKCQkJIk15U0wgT2JqOiAiIDw8CgkJCW1lbV9hIDw8ICIgLyAiIDw8CgkJCW51bV8xIDw8ICIgLyAiIDw8CgkJCW51bV8yIDw8ICIgLyAiIDw8CgkJCW51bV8zIDw8ICIgLyAiIDw8CgkJCW1lbV96IDw8ICJcbiI7Cgl9Cn07Cgp2b2lkIFplcm9JbnRzKE15U3RhbmRhcmRMYXlvdXQqIHBPYmopIHsKCWNvbnN0IHNpemVfdCBmaXJzdCA9IG9mZnNldG9mKE15U3RhbmRhcmRMYXlvdXQsIG51bV8xKTsKCWNvbnN0IHNpemVfdCB0aGlyZCA9IG9mZnNldG9mKE15U3RhbmRhcmRMYXlvdXQsIG51bV8zKTsKCXN0ZDo6Y291dCA8PCAib2ZzKDFzdCkgPSAgIiA8PCBmaXJzdCA8PCAiXG4iOwoJc3RkOjpjb3V0IDw8ICJvZnMoM3JkKSA9ICAiIDw8IHRoaXJkIDw8ICJcbiI7Cglhc3NlcnQodGhpcmQgPiBmaXJzdCk7Cgljb25zdCBzaXplX3QgZGVsdGEgPSB0aGlyZCAtIGZpcnN0OwoJc3RkOjpjb3V0IDw8ICJkZWx0YSA9ICAiIDw8IGRlbHRhIDw8ICJcbiI7Cgljb25zdCBzaXplX3Qgc2l6ZUFsbCA9IGRlbHRhICsgc2l6ZW9mKE15U3RhbmRhcmRMYXlvdXQ6Om51bV8zKTsKCXN0ZDo6Y291dCA8PCAic2l6ZUFsbCA9ICAiIDw8IHNpemVBbGwgPDwgIlxuIjsKCglzdGQ6OnZlY3RvcjxjaGFyPiBidWYoIHNpemVBbGwsIDAgKTsKCW1lbWNweSgmcE9iai0+bnVtXzEsICZidWZbMF0sIHNpemVBbGwpOwp9CgppbnQgbWFpbigpCnsKCU15U3RhbmRhcmRMYXlvdXQgb2JqOwoJb2JqLnByaW50KCk7CglaZXJvSW50cygmb2JqKTsKCW9iai5wcmludCgpOwoKICAgIHJldHVybiAwOwp9Cgo=