【问题标题】:Why object with vptr is 12 bytes longer?为什么带有 vptr 的对象长 12 个字节?
【发布时间】:2020-09-08 14:51:31
【问题描述】:
#include <iostream>

class B
{
    public:
    virtual void f() {std::cout<<"HI";}
    int x;
};
class A
{
    public:
    void f() {std::cout<<"HI";}
    int x;
};

int main () {
  A a;
  B b;
  std::cout<<sizeof(a)<<" "<<sizeof(b);

  return 0;
}

输出是

4 16 

我希望它长 8 个字节 - vptr 指针。但是剩下的 4 个字节是用来做什么的呢? 我发现了很多forum posts(都是几年前的),人们在其中讨论过使用 vprt 的类中的对象长 4 或 8 个字节。我还检查了online C++ shell - 输出是一样的。

【问题讨论】:

  • 对齐填充,我猜。
  • 在这里查看我的答案:stackoverflow.com/questions/58435348/… 不确定它是否符合欺骗的条件。
  • 这是因为一个指向虚函数表的新指针,当然还有填充,(从 12 到最接近的 2 的完美幂,即 16)。在类似的问题上检查此answer
  • @FredLarson 哦,你节省了我的时间,非常感谢!我完全忘记了对齐可能发生。长整数是 8 和 16
  • 如果您为 32 位目标而不是 64 位编译,您会观察到不同的大小。即48.

标签: c++ c++11 polymorphism virtual vptr


【解决方案1】:

似乎指向虚函数指针表的指针大小为 8 个字节。所以 B 类与 8 个字节的边界对齐,即它有 4 个额外的填充字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2016-03-15
    • 1970-01-01
    • 2020-05-24
    • 2017-08-04
    • 2012-12-04
    • 1970-01-01
    相关资源
    最近更新 更多