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(虚函数表指针)

  • 相关阅读:
    线段树扫描线求矩形面积并
    BZOJ-1103 [POI2007]大都市meg 【DFS序+树状数组】
    安徽大学第九届程序设计竞赛决赛题解
    如何解决Vue.js里面noVNC的截图问题(2)——蛋疼的cookies验证和node.js的websocket代理
    如何解决Vue.js里面noVNC的截图问题(1)——论可以跨域的webSocket
    从技术人视角看闪电网络之作用和局限性,以及一些问题的回答
    从技术人视角看闪电网络之闪电路由
    从技术人视角看闪电网络之微支付通道
    微服务化的大坑之一:当dubbo神器碰上共用注册中心和错误的暴露接口
    Fun论设计模式之1:简单工厂模式(Factory Pattern)
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3694587.html
Copyright © 2011-2022 走看看