返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++ class中成员与分配内存的问题详解
  • 263
分享到

c++ class中成员与分配内存的问题详解

2024-04-02 19:04:59 263人浏览 独家记忆
摘要

目录1.内存补齐2.特殊情况--virtual函数3.不需要考虑的内存总结1.内存补齐 便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐

1.内存补齐

便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐

类的整体内存就是由n块最大成员字节大小的区域组成的

而内存的分配对于成员变量来说是按照书写顺序来的(也就是构造顺序)如果不足最大成员大小,就自动填充

后一位变量如果无法排在前一位变量的那一块内存里面,就直接再开拓一块最大成员字节大小的空间存放自己,前一位的剩余空间自动填充


class A{   //sizeof = 8
  int a;
  char b;
  short c;
};

class B{  //sizeof = 12
  char a;
  int b;
  short c;
};

上面类A,B,最大都是int 4字节 :

A类,第一个是int ,4字节全部填满; 第二个char,1字节,还剩3字节;第三个short,2字节,补在第二个空间后,还剩一个字节自动补齐,一共2*4=8字节

B类,第一个是char,1字节,还剩三个字节;第二个int,4字节,第一个剩的空间不够,直接开拓下一个4字节,剩下的三字节自动填满;第三个short,2字节,还剩2字节自动补齐,一共3*4=12

2.特殊情况--virtual函数

如果一个类里面有虚函数,类会自动生成一个虚函数表指针,4字节的来管理虚函数

一个类无论有几个虚函数都只有有一个四字节的指针

而且这个指针在其他成员之前生成,也就是和你写虚函数的顺序无关

比如:


class A{            //实际上sizeof = 2*4=8 ,而不是12
  char a;
  virtual void f() {}
  short b;
};

上面等价于


class A{  
  T *table //虚函数指针      
  char a;
  short b;
};

按照上面的方法可得sizeof = 8

同样,由于虚函数指针是四个字节,如果成员里面有更高字节的,同样内存补齐


class A{                //sizeof = 8*2 = 16
  virtual void f() {}    
  double a;
};

3.不需要考虑的内存

每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间

一些看似成员的要注意不算内存

如:

一.静态函数和变量 :

静态函数和变量都不属于类管理,统一在常量内存区里面

二.非虚函数的成员函数 :

不是每一个对象都会生成成员函数,类的成员函数在其他内存区,对象用this指针调用的成员函数,其地址固定

三.友元函数和非虚函数的成员函数性质一样

总结

到此这篇关于c++ class中成员与分配内存问题的文章就介绍到这了,更多相关c++ class成员与分配内存内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: c++ class中成员与分配内存的问题详解

本文链接: https://lsjlt.com/news/137474.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • c++ class中成员与分配内存的问题详解
    目录1.内存补齐2.特殊情况--virtual函数3.不需要考虑的内存总结1.内存补齐 便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐 ...
    99+
    2024-04-02
  • 详解C语言在STM32中的内存分配问题
    01、前言 不说废话,先上示例代码 uint8_t num_byte[4]; uint32_t num_word; const uint32_t num_word_const =...
    99+
    2024-04-02
  • Android虚拟机中的内存分配与OOM问题详解
    目录背景知识一、Android VM的内存空间1.查看内存的API二、Android VM内存分配流程小结三、出现OOM的建议解决方案背景知识 Android中每个App默认情况下是...
    99+
    2024-04-02
  • C程序中Ubuntu、stm32的内存分配问题
    目录一、内存分区概念介绍1.1、C/C++编译程序的内存占用1.2、栈和堆、全局/静态存储区和常量存储区的对比1.3、图片说明 二、C语言编程论证1.1、Ubuntu测试代码实现 1...
    99+
    2024-04-02
  • C++中内存泄漏问题的分析与解决方案
    C++中内存泄漏问题的分析与解决方案概述:内存泄漏是指程序在动态分配内存后,没有及时释放导致内存无法再被程序使用的情况。在C++开发中,内存泄漏是一个常见且严重的问题,一旦发生,会导致程序运行效率下降,最终可能导致程序崩溃。本文将对C++中...
    99+
    2023-10-22
    分析(Analysis) 解决方案(Solution) 内存泄漏(Memory Leak)
  • 如何解决C程序中Ubuntu、stm32的内存分配问题
    这篇文章主要介绍了如何解决C程序中Ubuntu、stm32的内存分配问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、内存分区概念介绍1.1、C/C++编译程序的内存占用...
    99+
    2023-06-22
  • C语言动态内存泄露常见问题内存分配改进方法详解
    目录一、例题二、2种改进方法法1:二级指针(传址调用)法2:返回指针总结一、例题 试问该段代码能打印什么,或者不能打印什么,说出理由 #define _CRT_SECURE_NO...
    99+
    2024-04-02
  • 如何分析C语言在STM32中的内存分配问题
    今天就跟大家聊聊有关如何分析C语言在STM32中的内存分配问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。01、前言不说废话,先上示例代码uint8_t num_byte...
    99+
    2023-06-22
  • C++内存泄漏问题分析与解决方案
    C++内存泄漏问题分析与解决方案在C++的开发过程中,内存泄漏是一个常见的问题。当程序动态分配内存后却没有正确释放,在程序运行过程中会导致内存的不断累积,最终耗尽系统的可用内存。内存泄漏不仅会影响程序的性能,还可能导致程序崩溃甚至系统崩溃。...
    99+
    2023-10-22
    C++ 解决方案 内存泄漏
  • 详解C语言动态内存的分配
    目录C 程序中,不同数据在内存中分配说明内存动态分配的相关函数应用实例动态分配内存的基本原则总结C 程序中,不同数据在内存中分配说明 1)全局变量——内存中的...
    99+
    2024-04-02
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2024-04-02
  • C语言malloc分配问题详解
    目录前言一、malloc是什么?1.1malloc定义1.2malloc函数含义二、malloc的使用2.1添加头文件2.2malloc和free2.3malloc使用注意三、mal...
    99+
    2024-04-02
  • C++ 函数内存分配和销毁常见的内存泄漏问题
    c++++ 函数内存分配/销毁中的常见内存泄漏问题是:1. 忘记释放内存;2. 双重释放;3. 未处理异常;4. 循环引用。使用 raii 技术,如智能指针,可自动释放内存,避免泄漏。 ...
    99+
    2024-04-22
    c++ 内存泄漏
  • C++ 成员函数详解:对象方法的内存管理与生命周期
    成员函数内存管理与生命周期:内存分配:成员函数在对象创建时分配内存。对象生命周期:成员函数与对象绑定,对象创建时创建,对象销毁时销毁。构造函数:在对象创建时调用,用于初始化数据。析构函数...
    99+
    2024-04-29
    c++ 成员函数
  • C语言中关于动态内存分配的详解
    目录一、malloc 与free函数二、calloc三、realloc四、常见的动态内存的错误【C语言】动态内存分配 本期,我们将讲解malloc、calloc、realloc以及f...
    99+
    2024-04-02
  • C++ 成员函数详解:对象方法的虚继承与钻石问题
    虚继承解决了多重继承中的“钻石问题”,其中一个类从两个或多个具有相同基类的子类继承时。通过在派生类的继承规范中使用 virtual 关键字,派生类不会获得基类的副本,而是通过指针间接访问...
    99+
    2024-04-29
    c++ 虚继承
  • C#中struct与class的区别详解
    目录1.最大的区别2.struct成员无法被声明为protected。3.struct是隐式的sealed类4.struct中无法重载默认构造函数5.关于对象的初始化6.结构体没有析...
    99+
    2024-04-02
  • C++中常见的内存管理问题的详细解析
    C++是一种强大的编程语言,但同时也是一种需要仔细处理内存管理的语言。在使用C++编写程序时,经常会遇到内存管理问题。本文将详细解析C++中常见的内存管理问题,并提供具体的代码示例,帮助读者理解和解决这些问题。一、内存泄漏(Memory L...
    99+
    2023-10-22
    内存泄露 缓冲区溢出 野指针
  • C++超详细讲解内存空间分配与this指针
    目录成员属性和函数的存储空对象成员属性的存储成员函数的存储this指针的概念解决名称冲突返回对象指针*this总结成员属性和函数的存储 在C++中成员变量和成员函数是分开存储的; 空...
    99+
    2024-04-02
  • Golang程序中变量的内存分配与存储位置详解
    标题:Golang程序中变量的内存分配与存储位置详解 在Golang中,变量是程序中存储数据的基本单元。在编写Golang程序时,了解变量的内存分配和存储位置对于优化程序性能和避免内存...
    99+
    2024-02-28
    内存 变量 golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作