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++内存分配大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C/C++实现H264文件解析

    C/C++实现H264文件解析

    这篇文章主要为大家详细介绍了如何通过C++实现H264文件以及一段H264码流解析,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • C++实现LeetCode(768.可排序的最大块数之二)

    C++实现LeetCode(768.可排序的最大块数之二)

    这篇文章主要介绍了C++实现LeetCode(768.可排序的最大块数之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++使用boost::lexical_cast进行数值转换

    C++使用boost::lexical_cast进行数值转换

    这篇文章介绍了C++使用boost::lexical_cast进行数值转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)

    C++基于递归和非递归算法判定两个二叉树结构是否完全相同(结构和数据都相同)

    这篇文章主要介绍了C++基于递归和非递归算法判定两个二叉树结构是否完全相同,若判断二叉树的结构和数据都相同则为完全相同.涉及C++二叉树的创建、遍历、比较等相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • c++分离讲解模板的概念与使用

    c++分离讲解模板的概念与使用

    人们需要编写多个形式和功能都相似的函数,因此有了函数模板来减少重复劳动;人们也需要编写多个形式和功能都相似的类,于是 C++ 引人了类模板的概念,编译器从类模板可以自动生成多个类,避免了程序员的重复劳动
    2022-04-04
  • C语言围圈报数题目代码实现

    C语言围圈报数题目代码实现

    大家好,本篇文章主要讲的是C语言围圈报数题目代码实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C/C++关于实现CAN信号的获取方法

    C/C++关于实现CAN信号的获取方法

    这篇文章主要介绍了C/C++关于实现CAN信号的获取方法,标准的CAN 数据为8字节,即64位,但是CAN FD的最大数据可为64字节,为512位,其中的帧ID分为标准帧和扩展帧,其中用11位标准帧,用29位表示扩展帧
    2023-02-02
  • C++实现LeetCode(90.子集合之二)

    C++实现LeetCode(90.子集合之二)

    这篇文章主要介绍了C++实现LeetCode(90.子集合之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++ 队列相关知识总结

    c++ 队列相关知识总结

    这篇文章主要介绍了c++ 队列相关知识总结,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • linux使用gcc编译c语言共享库步骤

    linux使用gcc编译c语言共享库步骤

    这篇文章主要介绍了在linux中使用gcc编译c语言共享库的步骤,大家参考使用吧
    2014-01-01

最新评论