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。

  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/zhangwuji/p/5308671.html
Copyright © 2011-2022 走看看