c/c++内存分配大小实例讲解

 更新时间:2021年11月15日 08:39:17   作者:jihite  
在本篇文章里小编给大家整理了一篇关于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;
}

结果

Bb

分析

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

到此这篇关于c/c++内存分配大小实例讲解的文章就介绍到这了,更多相关c/c++内存分配大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Visual Studio 2019创建C++ Hello World项目的方法

    Visual Studio 2019创建C++ Hello World项目的方法

    这篇文章主要介绍了Visual Studio 2019创建C++ Hello World项目的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • VC++6.0实现直线扫描转换的图文教程

    VC++6.0实现直线扫描转换的图文教程

    这篇文章主要给大家介绍了关于VC++6.0实现直线扫描转换的相关资料,文中通过图文将实现的步骤一步步介绍的非常详细,对大家学习或者使用VC++6.0具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • C语言使用矩形法求定积分的通用函数

    C语言使用矩形法求定积分的通用函数

    这篇文章主要为大家详细介绍了C语言使用矩形法求定积分的通用函数,分别求解sinx, cosx,e^x,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言深入分析浮点型数据存储

    C语言深入分析浮点型数据存储

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • C语言实现简易扫雷程序

    C语言实现简易扫雷程序

    这篇文章主要为大家详细介绍了C语言实现简易扫雷程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 解读堆排序算法及用C++实现基于最大堆的堆排序示例

    解读堆排序算法及用C++实现基于最大堆的堆排序示例

    把待排序的数组构造出最大堆是进行堆排序操作的基本方法,这里将带大家来解读堆排序算法及用C++实现基于最大堆的堆排序示例,首先从堆排序的概念开始:
    2016-06-06
  • C语言实现拼图游戏源码

    C语言实现拼图游戏源码

    这篇文章主要为大家详细介绍了C语言实现拼图游戏源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++指针学习详解

    C++指针学习详解

    指针在 C\C++ 语言中是很重要的内容,并且和指针有关的内容一向令初学者头大,这篇文章主要给大家介绍了关于C/C++中指针的相关资料,需要的朋友可以参考下
    2021-09-09
  • VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

    VS+Qt+Halcon 显示图片,实现鼠标缩放、移动图片

    本篇博文记录一下,用VS+Qt+Halcon实现对图片的读取以及鼠标缩放,移动(鼠标事件调用了halcon自带的算子)的过程。感兴趣的可以了解一下
    2021-08-08
  • C语言简明清晰讲解枚举

    C语言简明清晰讲解枚举

    枚举法的本质就是从所有候选答案中去搜索正确的解,枚举算法简单粗暴,他暴力的枚举所有可能,尽可能地尝试所有的方法,感兴趣的朋友来看看吧
    2022-05-05

最新评论