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之正则表达式
    mysql之自定义函数
    mysql之replace into与 insert into duplicat key for update
    mysql之命令行导入导出
    Echarts修改legend样式
    ubuntu出现 E: Sub-process /usr/bin/dpkg returned an error code
    ubuntu总是提是E: 不能满足依赖关系。不妨试一下 -f 选项
    ubuntu安装和查看已安装软件
    放爬虫nginx
    nginx日志切割
  • 原文地址:https://www.cnblogs.com/xing901022/p/3798313.html
Copyright © 2011-2022 走看看