#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;
}

