fork download
  1. #include <vector>
  2. #include <iostream>
  3. #include <assert.h>
  4. #include <inttypes.h>
  5. #include <stddef.h>
  6. #include <memory.h>
  7.  
  8. struct MyStandardLayout {
  9. char mem_a;
  10. int16_t num_1;
  11. int32_t num_2;
  12. int64_t num_3;
  13. char mem_z;
  14.  
  15. MyStandardLayout()
  16. : mem_a('a')
  17. , num_1(1 + (1 << 14))
  18. , num_2(1 + (1 << 30))
  19. , num_3(1LL + (1LL << 62))
  20. , mem_z('z')
  21. { }
  22.  
  23. void print() const {
  24. std::cout <<
  25. "MySL Obj: " <<
  26. mem_a << " / " <<
  27. num_1 << " / " <<
  28. num_2 << " / " <<
  29. num_3 << " / " <<
  30. mem_z << "\n";
  31. }
  32. };
  33.  
  34. void ZeroInts(MyStandardLayout* pObj) {
  35. const size_t first = offsetof(MyStandardLayout, num_1);
  36. const size_t third = offsetof(MyStandardLayout, num_3);
  37. std::cout << "ofs(1st) = " << first << "\n";
  38. std::cout << "ofs(3rd) = " << third << "\n";
  39. assert(third > first);
  40. const size_t delta = third - first;
  41. std::cout << "delta = " << delta << "\n";
  42. const size_t sizeAll = delta + sizeof(MyStandardLayout::num_3);
  43. std::cout << "sizeAll = " << sizeAll << "\n";
  44.  
  45. std::vector<char> buf( sizeAll, 0 );
  46. memcpy(&pObj->num_1, &buf[0], sizeAll);
  47. }
  48.  
  49. int main()
  50. {
  51. MyStandardLayout obj;
  52. obj.print();
  53. ZeroInts(&obj);
  54. obj.print();
  55.  
  56. return 0;
  57. }
  58.  
  59.  
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
MySL Obj: a / 16385 / 1073741825 / 4611686018427387905 / z
ofs(1st) =  2
ofs(3rd) =  8
delta =  6
sizeAll =  14
MySL Obj: a / 0 / 0 / 0 / z