zoukankan      html  css  js  c++  java
  • c++中类长度解析

      通常我们定义一个类,它所占的空间有多大呢?

    首先我们看一下下面的这个类

    class A{
    public:
        void func1(void){
            printf("11111heihei
    ");
        };
        void func2(void){
            printf("11111heihei
    ");
        };
    public:
        int number;
    };
    class B{
    public:
        void func1(void){
            printf("heihei
    ");
        };
        void func2(void){
            printf("heihei
    ");
        };
    public:
        char number;
        int number1;
    };

    我们输出这两个类的长度

     1 #include <stdio.h>
     2 class A{
     3 public:
     4     void func1(void){
     5         printf("11111heihei
    ");
     6     };
     7     void func2(void){
     8         printf("11111heihei
    ");
     9     };
    10 public:
    11     int number;
    12 };
    13 class B{
    14 public:
    15     void func1(void){
    16         printf("heihei
    ");
    17     };
    18     void func2(void){
    19         printf("heihei
    ");
    20     };
    21 public:
    22     char number;
    23     int number1;
    24 };
    25 int main(){
    26     printf("A %d B %d
    ",sizeof(A),sizeof(B));
    27     getchar(); 
    28      return 0;
    29 }
    View Code

    得到结果:

      至于为什么第二个是8,就是内存对齐的问题了,可以参考之前的内存申请的帖子

      我们发现,一个类的长度是它的变量所占用的空间,也就是说函数是不占用空间的。这是因为一个类的变量时属于对象的,而一个类的函数是属于这个类的。

      那么因对象不同而不同的虚函数又会怎样呢?

      我们接着看下面两个类:

    class A{
    public:
        virtual void func1(void){
            printf("11111heihei
    ");
        };
        void func2(void){
            printf("11111heihei
    ");
        };
    public:
        int number;
    };
    class B{
    public:
        virtual void func1(void){
            printf("heihei
    ");
        };
        virtual void func2(void){
            printf("heihei
    ");
        };
    public:
        int number1;
    };

      按照下面的函数输出,得到结果:

     1 #include <stdio.h>
     2 class A{
     3 public:
     4     virtual void func1(void){
     5         printf("11111heihei
    ");
     6     };
     7     void func2(void){
     8         printf("11111heihei
    ");
     9     };
    10 public:
    11     int number;
    12 };
    13 class B{
    14 public:
    15     virtual void func1(void){
    16         printf("heihei
    ");
    17     };
    18     virtual void func2(void){
    19         printf("heihei
    ");
    20     };
    21 public:
    22     int number1;
    23 };
    24 int main(){
    25     printf("A %d B %d
    ",sizeof(A),sizeof(B));
    26     getchar(); 
    27      return 0;
    28 }
    View Code

      我们发现,多了4个字节。这是因为虚函数要为对象分配一个虚函数表vptr,通过这个指针来调用虚函数。因此有虚函数的类,会多出一个指针的空间。但仅仅分配一个指针。比如第一个函数会用vptr[1]来表示,第二个用vptr[2]来表示,而索引0是表的信息。

      如有不对的地方,还请多多指正。

  • 相关阅读:
    深入理解Java Proxy机制
    StringBuilder与StringBuffer的区别
    反射
    list和set区别
    spring总结
    Hibernate与 MyBatis的比较
    手机拍照或选择照片上传html5代码
    JSP两种跳转
    离散化
    圆方树
  • 原文地址:https://www.cnblogs.com/xing901022/p/3798313.html
Copyright © 2011-2022 走看看