zoukankan      html  css  js  c++  java
  • C++ 类里面,函数占用存储空间问题

      转载自:http://blog.163.com/xping_lsr/blog/static/19654034520119804131721/

    先看两段代码:


    代码段1:
    class A
    {
    public:
    int print(){ cout<<"This is A"<<endl;}
    };
    inr main()
    {
    A a;
    cout << "Size of A = " << sizeof(a) << endl;
    }

    输出结果:
    Size of A =1

    代码段2:

    class A
    {
    public:
    int print1(){ cout<<"This is A"<<endl;}
    int print2(){ cout<<"This is A"<<endl;}
    int print3(){ cout<<"This is A"<<endl;}
    };
    inr main()
    {
    A a;
    cout << "Size of A = " << sizeof(a) << endl;
    }

    输出结果:
    Size of A =1

    对象的大小是它的数据成员所占存储空间之和,就和结构体一样。类中的函数是所有该类对象通用的方法,不算作对象的成员,因此也不算在对象的存储空间内

    问题:类里面不管有多少个函数,这个类的对象只占1个字节的内存。这个字节的内存的内容是什么?是指针吗?指针不是占4个字节吗?

    当类中类有定义任何变量的时候,类的对象都是1个字节的,当类中没有任何变量的时候,这个类里没有任何真正的成员变量,所以大小应该是0,但0大小不好在内存中定位一个地址,所以,就规定它大小为0的对象要占一字节空间,以便让它拥有一个合法的地址。如果是有派生类的,还有考虑到内存对齐的问题的。

    另外涉及到虚函数的话又不一样了。如

    class A
    {
    public:
    virtual int print(){ cout<<"This is A"<<endl;}
    };
    如果sizeof(A)的话,得出的是4。

    原因是涉及到虚函数的实现问题。

    class Class1

    {

        m_data1;

       m_data2;

      virtual vfunc1()

      virtual vfunc2()

      virtual vfunc3()

    };

    Class1对象实例

    vptr

    m_data1

    m_data2

    通过vptr指针找到虚函数表

     

    Vtable(虚函数表)

    (*vfunc1)()

    (*vfunc2)()

    (*vfunc3)()

     

    Class1::vfunc1()

    Class1::vfunc2()

    Class1::vfunc3()

     

    所以回到原来的问题,A中只有一个或者几个虚函数的话,没有成员变量,那么类A相当于含有一个vptr指向虚函数表的指针,所以sizeof(A)=4。

    还有一点,如

    class B

    {

    };

    class B2

    {

    };

    class C:public B

    {

    };

    class D:public virtual B

    {

    };

    class E:public B,public B2

    {

    };

    sizeof(B) = 1;   sizeof(B2) = 1;  sizeof(C) = 1;  sizeof(D) = 4;  sizeof(E) = 1;

    空类所占空间为一(上文以解释),单一继承的空类空间也是1,多重继承的空类空间还是1,但是虚继承涉及到虚表(虚指针),所以sizeof(D)=4。

  • 相关阅读:
    jsp四个域对象
    java,qq邮箱发邮件工具类(需要部分修改)
    Java使用qq邮箱发邮件实现
    JavaScript 高级
    JavaScript基础
    JQuery 高级
    JQuery 基础
    团队最后一次作业:总结
    C++多态
    结对编程
  • 原文地址:https://www.cnblogs.com/zhangwuji/p/5308671.html
Copyright © 2011-2022 走看看