fork(1) download
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string>
  4.  
  5. struct A
  6. {
  7. A(const std::string& pa) : a(pa) {printf("CTR: A address: %p\n", this) ;}
  8. std::string a;
  9. };
  10.  
  11. struct B
  12. {
  13. B(const std::string& pb) : b(pb) {printf("CTR: B address: %p\n", this) ;}
  14. std::string b;
  15. };
  16.  
  17. // assumed data layout:
  18. struct C {
  19.  
  20. C() : a("astring"), b("bstring") {}
  21. // ...
  22. A a;
  23. // ...
  24. B b;
  25. };
  26.  
  27. void approach1( A *pa, B *pb )
  28. {
  29.  
  30. printf("approach1: A address: %p B address: %p\n", pa, pb);
  31. // compute offset:
  32. std::ptrdiff_t offset = static_cast<char*>((void*)pb) - static_cast<char*>((void*)pa);
  33. // then in some other function...
  34. // given offset and ptr to b, compute ptr to a:
  35. A *a = static_cast<A*>( (void*)(static_cast<char*>((void*)pb) + offset) );
  36. printf("approach1: a address: %p \n", a);
  37.  
  38. std::cout << "approach1: A->a=" << a->a << std::endl;
  39. }
  40.  
  41.  
  42. void approach2( A *pa, B *pb )
  43. {
  44. printf("approach2: A address: %p B address: %p\n", pa, pb);
  45.  
  46. std::ptrdiff_t offset = reinterpret_cast<char*>(pb) - reinterpret_cast<char*>(pa);
  47.  
  48. A *a = reinterpret_cast<A*>( reinterpret_cast<char*>(pb) + offset );
  49. printf("approach2: a address: %p \n", a);
  50. std::cout << "approach2: A->a=" << a->a << std::endl;
  51. }
  52.  
  53. main()
  54. {
  55. C c;
  56. std::cout << c.a.a << std::endl;
  57.  
  58. approach1(&c.a, &c.b);
  59. approach2(&c.a, &c.b);
  60. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
CTR: A address: 0xbfb572b8
CTR: B address: 0xbfb572bc
astring
approach1: A address: 0xbfb572b8 B address: 0xbfb572bc
approach1: a address: 0xbfb572c0 
approach1: A->a=
approach2: A address: 0xbfb572b8 B address: 0xbfb572bc
approach2: a address: 0xbfb572c0 
approach2: A->a=