c++ - 如何读取指向派生类的基类指针数组的内存布局

标签 c++

我做了一些实验以了解基类指针数组的内存布局。

问题> 初始化后(Case I & II),为什么每个指针之间的距离是20字节。这个数字从何而来?

谢谢

#include <iostream>
using namespace std;

class A {
public:  
  virtual void PrintMe() const {
    cout << "class A; ";
  }

  ~A() {}
};

class B : public A {
private:
  int num;
public:

  virtual void PrintMe() const {
    cout << "class B; ";
  }
};

int main() {

  int a[2];  

  cout << "&a[0]: " << hex << &a[0] << endl;
  cout << "&a[1]: " << hex << &a[1] << endl;
  cout << "sizeof(int): " << sizeof(int) << endl;
  cout << "sizeof(int*): " << sizeof(int*) << endl;
  cout << "sizeof(A): " << sizeof(A) << endl;
  cout << "sizeof(A*): " << sizeof(A*) << endl;
  cout << "sizeof(B): " << sizeof(B) << endl;
  cout << "sizeof(B*): " << sizeof(B*) << endl;

  A* vec[5];
  cout << "Before initializatiion: " << endl;
  for(int i=0; i < 5; ++i)
  {
    cout << "vec[" << i << "]: " << hex << vec[i] << endl;
  }

  cout << "After initialization with A* ONLY: " << endl;  // case I
  for(int i=0; i < 5; i++)
    vec[i] = new A();
  for(int i=0; i < 5; ++i)
  {
    vec[i]->PrintMe();
    cout << "vec[" << i << "]: " << hex << vec[i] << endl;
  }

  cout << "After initialization with B* & A*: " << endl; // case II
  for(int i = 0; i < 3; i++)
      vec[i] = new B();
  for(int i=3; i < 5; i++)
    vec[i] = new A();

  for(int i=0; i < 5; ++i)
  {
    vec[i]->PrintMe();
    cout << "vec[" << i << "]: " << hex << vec[i] << endl;
  }  

  return 0;
}

输出:

&a[0]: 0x7fff0a6d3c40
&a[1]: 0x7fff0a6d3c44
sizeof(int): 4
sizeof(int*): 8
sizeof(A): 8
sizeof(A*): 8
sizeof(B): 10
sizeof(B*): 8
Before initializatiion: 
vec[0]: 0x2
vec[1]: 0x4011ed
vec[2]: 0x7f7b9a2a6a70
vec[3]: 0x401190
vec[4]: 0
After initialization with A* ONLY: 
class A; vec[0]: 0xc51010
class A; vec[1]: 0xc51030
class A; vec[2]: 0xc51050
class A; vec[3]: 0xc51070
class A; vec[4]: 0xc51090
After initialization with B* & A*: 
class B; vec[0]: 0xc510b0
class B; vec[1]: 0xc510d0
class B; vec[2]: 0xc510f0
class A; vec[3]: 0xc51110
class A; vec[4]: 0xc51130

最佳答案

当您使用以下方法填充指针数组时:

for(int i=0; i < 5; i++)
    vec[i] = new A();

无法保证vec[1]vec[0] 之间的差异与sizeof(A) 有任何关系。赋予它任何意义是没有意义的。

如果您使用:

A aArray[5];
for(int i=0; i < 5; i++)
    vec[i] = &(aArray[i]);

vec[1]vec[0] 之间的差异保证为 sizeof(A)

关于c++ - 如何读取指向派生类的基类指针数组的内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25635310/

相关文章:

c++ - Arch Linux 上的 SDL2 : window renders what's on the screen behind it

c++ - 链接器生成的 .map 文件有什么用?

c++ - 数组分配问题

C++如何将用户的输入解析为执行代码?

c++ - 使用排序数组实现集合

c++ - C++ 返回时触发事件

c++ - DirectX11 ClearRenderTargetView

c++ - 防止多态类中的内存泄漏

c++ - x&&y||z 是如何计算的?

c++ - 如何制作CDialog?