nmvbxcz 2017-05-10 09:45 采纳率: 0%
浏览 1396

C++ sizeof类的大小问题

#include <iostream>
using namespace std;

class Base
{
public:
    int a;   //有这句话和没有这句话运行结果差距很大
    Base(){cout<<"Base-ctor"<<endl;}
    ~Base(){cout<<"Base-dtor"<<endl;}
    virtual void f(int) {cout<<"Base::f(int)"<<endl;}
    virtual void f(double){cout<<"Base::f(double)"<<endl;}
};

class Derived:virtual public Base
{
public:
    Derived(){cout<<"Derived-ctor"<<endl;}
    virtual void g(int){cout<<"Derived::g(int)"<<endl;}
};

int main(){
    cout<<sizeof(Base)<<endl;
    cout<<sizeof(Derived)<<endl;
}

不知道为什么有int和没用int完全不一样,没有int结果是8 8,有int是16 24,差距已经不是一个int的问题了

  • 写回答

2条回答 默认 最新

  • 关注

    没有int的话Base应该是4吧,Der也是4吧,Base是4的话比较好理解就是一个虚指针占4个字节内存,Der是4个可能是编译器的优化,把两个Der的表与Base虚表结合了,本身虚继承会产生多个虚指针,两个虚指针优化为一个。
    有int的话Base应该是8,Der会变成12,为什么会Der比Base多4个字节就是把虚表分开了,怕虚基类与继承类数据发生混乱,从而采取两个虚指针。可以多看看深入探索C++对象模型,把C++在内存中布局与虚函数讲的很清楚。

    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮