zoukankan      html  css  js  c++  java
  • 【c/c++】内存分配大小

    测试平台:linux 32位系统

    用sizeof()运算符计算分配空间大小。单位:字节

    1. 数组名与变量名的区别

    int main()
    {
        char q[] = "hello";
        cout << "q:" << sizeof(q) << endl;
        char *mq = q;
        cout << "mq:" << sizeof(mq) << endl;
    
        const char *p = "hello";
        cout << "p:" << sizeof(p) << endl;
    }

    结果

    q:6  
    mq:4
    p:4
    

    分析

    q是数组名,申请内存是编译器记住了,但是赋值给mq后,mq和p一样是一个普通的指针了,大小为4.

    总之:c/c++没有办法知道指针所指的内存容量,除非在申请时记住它

    2. 类的内存分配

    2.1 空类

    #include <iostream>
    using namespace std;
    
    
    class A
    {
    };
    
    int main()
    {
        A a;
        cout << sizeof(a) << endl;
    }

    结果

    1
    

    分析

    所谓类的实例化就是在内存中分配一块地址(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.因为如果空类不隐含加一个字节的话,则空类无所谓实例化了(因为类的实例化就是在内存中分配一块地址。

    2.2 类只有成员变量

    #include <iostream>
    using namespace std;
    
    
    class A
    {
        public:
            int val;
    };
    
    int main()
    {
        A a;
        cout << sizeof(a) << endl;
    }

    结果

    4
    

    解释

    这个4是int类型类的成员变量所占字节数

    2.2 类含有成员函数

    #include <iostream>
    using namespace std;
    
    
    class A
    {
        public:
            A(int value) : val(value) {}
            int val;
    };
    
    int main()
    {
        A a(3);
        cout << sizeof(a) << endl;
    }

    结果

    4
    

    分析

    这个4是int类型类的成员变量所占字节数。即成员函数没有占空间。原因是这样的:成员函数不属于类(或类的对象),所有的成员函数和全局函数都在代码段,在调用成员函数时,会隐式的通过this指针过去调用。

    3.3 类中含有静态成员

    #include <iostream>
    using namespace std;
    
    
    class A
    {
        public:
            A(int value) : val(value) {}
            int val;
            static int sta_val;
    };
    int A::sta_val = 3;
    
    int main()
    {
        A a(3);
        cout << sizeof(a) << endl;
    }

    结果

    4
    

    分析

    这个4仍然是int类型类的成员变量所占字节数。static变量存放于静态区,并不和普通成员变量(存于栈)放在一起。

    3.4 类中含有virtural函数

    #include <iostream>
    using namespace std;
    
    
    class A
    {
        public:
            int val;
            virtual void fuc() { cout << "hello" << endl; } 
    };
    
    
    int main()
    {
        A a;
        cout << sizeof(a) << endl;
    }

    结果

    8
    

    分析

    virtual 会增加4个字节大小的空间。原因:增加一个virtual ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表),例证

    #include <iostream>
    using namespace std;
    
    
    class A
    {
        public:
            int val;
            virtual void fuc() { cout << "hello" << endl; } 
            virtual void fuc2() { cout << "hello" << endl; } 
    };
    
    
    int main()
    {
        A a;
        cout << sizeof(a) << endl;
    }

    结果

    8
    

    3.5 子类空间分配

    例子1

    #include <iostream>
    using namespace std;
    
    
    class A
    {
        public:
            int val;
    };
    
    class B : public A
    {
        int valb;
    };
    
    
    int main()
    {
        B b;
        cout << sizeof(b) << endl;
    }

    结果

    8
    

     例子2

    #include <iostream>
    using namespace std;
    
    
    class A
    {
        public:
            int val;
            virtual void fuc() {}
    };
    
    class B : public A
    {
        int valb;
    };
    
    
    int main()
    {
        B b;
        cout << sizeof(b) << endl;
    }

    结果

    12
    

    分析

    4 + 4 + 4(虚函数表指针)

  • 相关阅读:
    Python中所有的关键字
    关于selenium的8种元素定位
    对提示框的操作
    selenium+webservice进行百度登录
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled...报错解决
    Vue中使用echarts
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142解决方法
    插入排序
    冒泡排序优化
    roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3694587.html
Copyright © 2011-2022 走看看