fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct T {
  5. virtual void foo();
  6. int i;
  7. };
  8.  
  9. void displayT() {
  10. T ob;
  11. char *base = (char*)&ob; // spare me the new style casts
  12. int off_i = (char*)&ob.i - base;
  13. cout << "sizeof T is " << sizeof ob;
  14. cout << "\nsizeof i is " << sizeof ob.i;
  15. cout << "\ni is at offset " << off_i;
  16.  
  17. string layout (sizeof ob, '*');
  18. layout.replace (off_i, sizeof ob.i, sizeof ob.i, 'i');
  19. cout << "\nlayout of T is \n" << layout << "\n";
  20. }
  21.  
  22. struct U {
  23. virtual void bar();
  24. long long l;
  25. };
  26.  
  27. void displayU() {
  28. U ob;
  29. char *base = (char*)&ob;
  30. int off_l = (char*)&ob.l - base;
  31. cout << "sizeof U is " << sizeof ob;
  32. cout << "\nsizeof U::l is " << sizeof ob.l;
  33. cout << "\nl is at offset " << off_l;
  34.  
  35. string layout (sizeof ob, '*');
  36. layout.replace (off_l, sizeof ob.l, sizeof ob.l, 'l');
  37. cout << "\nlayout of U is \n" << layout << "\n";
  38. }
  39.  
  40. struct Der : T, U{
  41. };
  42.  
  43. void displayDer() {
  44. Der ob;
  45. T &t = ob;
  46. U &u = ob;
  47. char *base = (char*)&ob;
  48. int off_i = (char*)&ob.i - base;
  49. int off_l = (char*)&ob.l - base;
  50. int off_T = (char*)&t - base;
  51. int off_U = (char*)&u - base;
  52.  
  53. cout << "sizeof Der is " << sizeof ob;
  54. cout << "\nDer::i is at offset " << off_i;
  55. cout << "\nDer::l is at offset " << off_l;
  56. cout << "\nDer::T is at offset " << off_T;
  57. cout << "\nDer::U is at offset " << off_U;
  58.  
  59. string layout (sizeof ob, '*');
  60. layout.replace (off_T, sizeof(T), sizeof (T), 'T');
  61. layout.replace (off_U, sizeof(U), sizeof (U), 'U');
  62. layout.replace (off_i, sizeof ob.i, sizeof ob.i, 'i');
  63. layout.replace (off_l, sizeof ob.l, sizeof ob.l, 'l');
  64. cout << "\nlayout of Der is \n" << layout << "\n";
  65. }
  66.  
  67. struct Der2 : virtual T, U{
  68. };
  69.  
  70. void displayDer2() {
  71. Der2 ob;
  72. T &t = ob;
  73. U &u = ob;
  74. char *base = (char*)&ob;
  75. int off_i = (char*)&ob.i - base;
  76. int off_l = (char*)&ob.l - base;
  77. int off_T = (char*)&t - base;
  78. int off_U = (char*)&u - base;
  79.  
  80. cout << "sizeof Der2 is " << sizeof ob;
  81. cout << "\nDer2::i is at offset " << off_i;
  82. cout << "\nDer2::l is at offset " << off_l;
  83. cout << "\nDer2::T is at offset " << off_T;
  84. cout << "\nDer2::U is at offset " << off_U;
  85.  
  86. string layout (sizeof ob, '*');
  87. layout.replace (off_T, sizeof(T), sizeof (T), 'T');
  88. layout.replace (off_U, sizeof(U), sizeof (U), 'U');
  89. layout.replace (off_i, sizeof ob.i, sizeof ob.i, 'i');
  90. layout.replace (off_l, sizeof ob.l, sizeof ob.l, 'l');
  91. cout << "\nlayout of Der2 is \n" << layout << "\n";
  92. }
  93.  
  94. struct Der3 : virtual T, virtual U{
  95. };
  96.  
  97. void displayDer3() {
  98. Der3 ob;
  99. T &t = ob;
  100. U &u = ob;
  101. char *base = (char*)&ob;
  102. int off_i = (char*)&ob.i - base;
  103. int off_l = (char*)&ob.l - base;
  104. int off_T = (char*)&t - base;
  105. int off_U = (char*)&u - base;
  106.  
  107. cout << "sizeof Der3 is " << sizeof ob;
  108. cout << "\nDer3::i is at offset " << off_i;
  109. cout << "\nDer3::l is at offset " << off_l;
  110. cout << "\nDer3::T is at offset " << off_T;
  111. cout << "\nDer3::U is at offset " << off_U;
  112.  
  113. string layout (sizeof ob, '*');
  114. layout.replace (off_T, sizeof(T), sizeof (T), 'T');
  115. layout.replace (off_U, sizeof(U), sizeof (U), 'U');
  116. layout.replace (off_i, sizeof ob.i, sizeof ob.i, 'i');
  117. layout.replace (off_l, sizeof ob.l, sizeof ob.l, 'l');
  118. cout << "\nlayout of Der3 is \n" << layout << "\n";
  119. }
  120.  
  121. int main() {
  122. cout << "sizeof void* is " << sizeof(void*) << "\n";
  123. displayT();
  124. displayU();
  125. displayDer();
  126. displayDer2();
  127. displayDer3();
  128. return 0;
  129. }
  130.  
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
sizeof void* is 4
sizeof T is 8
sizeof i is 4
i is at offset 4
layout of T is 
****iiii
sizeof U is 12
sizeof U::l is 8
l is at offset 4
layout of U is 
****llllllll
sizeof Der is 20
Der::i is at offset 4
Der::l is at offset 12
Der::T is at offset 0
Der::U is at offset 8
layout of Der is 
TTTTiiiiUUUUllllllll
sizeof Der2 is 20
Der2::i is at offset 16
Der2::l is at offset 4
Der2::T is at offset 12
Der2::U is at offset 0
layout of Der2 is 
UUUUllllllllTTTTiiii
sizeof Der3 is 24
Der3::i is at offset 8
Der3::l is at offset 16
Der3::T is at offset 4
Der3::U is at offset 12
layout of Der3 is 
****TTTTiiiiUUUUllllllll