C++对象内存布局(1)

C++对象内存布局 介绍C++对象在内存中是怎样分布的,有助于深层学习C++。 立即下载

基础类型

基础类型
注意:在有的机器上double是4bytes。

类的填充问题

class A {
    int a;
    short b;
    int c;
    char d;
};
class B {
    double a;
    int c;
    double d;
    int e;
};

类的size计算的基本原则是:
1. 类的单位是以块(Block)计算的,一块等于类中最大成员的size
2. 类的大小是块的整数倍,比如A最大的成员是Int,所以A的size为4的倍数,而B为8的倍数(在这里double为8个byte)
3. 类的对象模型是按声明顺序排序的,也就是一个对象挨着一个对象排序,如果对象相加不到一块的大小,则填充这个类,使其达到块的大小

A和B的大小分别为16和32。

栈和堆以及内存分配

我们分配内存有两种方式,一种是分配在栈上,一种是分配到堆上。

我们在一个作用域上分配的临时变量就是分配在栈上,离开作用域就会自动销毁,常见的场景有传入参数和声明初始化用于循环时的index变量。

典型的栈变量:

int i = 0;
Complex s1(1, 2);
Complex s2(3, 4);

栈对象由系统自动回收,所以我们无需手动删除对象。

而堆对象则需要我们手动删除对象并回收内存,堆对象主要是用molloc和new分配的内存。

Complex* p_s = new Complex(5, 5);
delete p_s;

堆对象给了我们很大的灵活性,但同时也带来了危险。

自由的代价就是永远的警惕!

如果我们分配在堆上分配了内存,但却没有回收,则会造成内存泄漏,短时间运行的程序可能没什么,毕竟程序关闭则所有内存都会回收,但如果是长时间运行的程序则会造成严重的内存浪费问题,影响运行性能。

可以光有堆而没有栈吗?或者反过来呢?

在这里就明确告诉你——不兹慈!

为什么呢?因为栈对象是编译时就已经确定了大小,在运行时就无法分配更多内存了,如果全部是栈对象,那么当我们需要更多内存时就悲剧了。

如果只有堆的话更不行,因为指针是在栈上分配的,可是你连可以分配堆对象的指针对象都没有,怎么分配内存?

Debug和Release模式

在Debug模式下,一个类实际会增加很多调试信息,所以实际在内存中的size远远不止你用sizeof看到的这点。在Release对象中也是会夹杂一点内存的信息,否则系统就不知道从哪里开始回收内存了。

而数组对象和普通对象在内存中的存储方式也不一样,数组对象他会在实际的对象前保存这个数组的长度。而普通对象则不会这么做。

New和Delete以及Array

在用指针在堆上创建对象时,一般使用new关键字创建用delete关键字删除。而我们在创建数组时,却必须要使用delete[] 关键字。这是为什么呢?下面我们就来看一下它们内部的实现原理。

delete关键字回收对象的内存模型,也就是说长条的长方形中所有内存都会被释放,如果该对象是指针,则释放第一个指针对象。

好了,现在你应该知道为什么数组应该使用delete[]关键字了吧。如果数组不是指针数组那么这两个关键字都可以释放内存,但如果数组是指针数组,那么指针所指向的堆的内存则不会被释放,从而造成大量的内存泄漏!

用HFSS仿真平面线圈的电感量 平面线圈是指在平面上绕制而成的线圈,如PCB上的电感线圈、无线供电使用的金属丝绕制而成的线圈等。根据线圈的不同形状可将平面线圈分为方形线圈,六角形线圈、八角形线圈、螺旋原型线圈等。 阅读详情

相关推荐

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

关于c++中内存对齐的一些问题

假设有以下代码: #include <stdlib.h> #include <stdio.h> class A{ int a; short b; char c; int d; }; class B{ double e; int f; short g; char h; }; int main()...

AurumMann的博客 361

Codesys电子凸轮实战:从机械替代到虚轴设计的5个关键步骤

本文详细介绍了Codesys电子凸轮技术在运动控制领域的实战应用,从机械替代到虚轴设计的5个关键步骤。通过电子凸轮技术,操作员可以快速调整切割模式,显著提升产线效率。文章还探讨了虚轴架构、CAM表设计、动态耦合技巧及调试避坑指南,为工业自动化领域提供了实用的解决方案。

tech5的博客 767

C++ sizeof()练习

class A { int a; short b; int c; char d; }; class B { double a; short b; int c; char d; }; 在32位机器上用gcc编译以上代码,求sizeo...

acxm45824的博客 236

告别WSL!用AMD ROCm7在Windows上跑ComfyUI,我的幻x2025 AI Max+ 395体验与性能调优心得

本文详细介绍了在搭载AMD Ryzen AI Max+ 395处理器的幻x2025笔记本上,如何通过ROCm7在Windows原生环境下高效运行ComfyUI,并分享了一系列性能调优技巧和实战经验,帮助开发者摆脱WSL束缚,提升AI创作效率。

weixin_29102619的博客 1114

Gromacs基础教程一:入门建议

本系列教程针对的群体:非计算化学专业,而是偏生物方向的、有少量分子动力学模拟需求的人群。

m0_67843839的博客 8572

C++ 字节对齐

#include class A { int a; char b; bool c; }; class B { char a; int b; bool c; }; class C { char a; char b; short c; }; class D { c

大漠孤舟 668

电池管理系统(BMS)系列(四)—数据采集之温度

属于BMS系列文章,介绍了电池包温度采集相关方式

zxx52113140的博客 5456

BAT笔试试题常见试题总结含答案(持续更新。。。)

(1)试题例如以下: class A { int a; short b; int c; char d; }; class B { double a; short b; int c; char d; }; 在32位机器上用gcc编译以上代码,求si...

weixin_34223655的博客 237

目标检测之Mask R-CNN(Pytorch):小白动手实现项目

目标检测之Mask R-CNN:小白动手实现项目Pytorch引言Mask R-CNN原理简述代码、注释及详细解释 引言 首先声明本项目的运行环境。操作系统为Windows,编写环境为Anaconda3 + Jupyter Notebook。Pytorch版本为 torch 1.7.1+cu110 、torchvision版本为 0.8.2+cu110,cuda版本为cu100,显卡为Nvidia 2060。 我是目标检测领域的小白,刚刚完成了Pytorch的相关入门学习任务,所以我认为学习本篇博客的基础

dzc_go的博客 1万+

【Coze搞钱实战】24. 从零实现精准用户画像:Coze+企业微信打造智能导购推送系统(附完整代码)

电商运营中,“客服重复询问用户需求、无法精准推荐”是转化率低的核心痛点——日均200人次咨询,73%的问题是重复的,首单转化率仅14%。本文基于Coze平台sys_uuid用户识别功能、企业微信API与多维表格,打造“用户行为→自动打标→标签存储→智能推送”全链路方案:通过分类分层标签体系捕捉用户偏好,Coze自动识别用户并打标,飞书多维表格存储标签数据,企业微信触发个性化推送。实操后可使客服重复询问率下降62%,意向客户转化率提升81%,首单转化率提升64%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 542

C++对象模型之内存布局(1)

了解C++类的内存布局以及成员函数是怎么调用,有助于理解C++多态的实现原理。 无多态对象布局 单个类: 定义一个类A class A { public: A(int a1 = 0, int a2 = 0); ~A(); void A1(); protected: int a1; int a2; }; 如果类没有虚函数,那么class的布局和struct布局一样,只有成员变...

不懂边城的博客 299

7、布尔网络的基础定义

本文介绍了布尔网络的基础定义及其在系统生物学中的应用。布尔网络是一种描述复杂系统动态行为的数学模型,由布尔变量和布尔函数组成,能够模拟生物系统中基因调控、信号传导和细胞代谢等过程。文章详细阐述了布尔网络的基本结构、动力学特征(如状态转移图和吸引子),以及其在生物建模中的重要价值,并探讨了优化和简化技术(如Backward Boolean Equivalence)如何提升其计算效率。

yhn45678901的博客 262

vs2008下C++对象内存布局(1)

快乐虾http://blog.youkuaiyun.com/lights_joy/lights@hb165.com 本文适用于Xp sp3Vs2008 欢迎转载,但请保留作者信息 近日,因为调试cygwin.dll出了点状况,与C++对象的内存布局有关,故此决定先看看vs2008对C

嵌云阁 6109

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++ 对象内存布局 (1)

转载来自http://blog.youkuaiyun.com/pathuang68/article/details/4101970 1 内容概要: 满足下面2个条件时, 1. 父类有虚函数,子类无虚函数(即无虚函数重写或无虚函数覆盖) 2. 非虚继承 类对象之内存布局 Base类中有两个虚函数vfBase_1()、vfBase_2()和一个整形成员变量m_base, Derived类中有一个整...

weixin_30706507的博客 75

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《深度探索C++对象模型》阅读笔记(一)——对象的内存布局1

本章是从整个对象的全局观来审视C++,并对比C++和C,讨论出一个较为高效和简明的C++对象模型,最后详细介绍了继承如何对程序造成影响。 主要分为以下几个内容: 引入。C++如何基于C构建对象C++简单对象的内存布局模型讨论Class 和 Struct 间的关系和影响详细讨论对象的继承 关于C++的强大以及C的简洁之间的讨论已经很多,因而我不打算介绍C++是如何基于C构建对象的。而是

飞奔在原野 1389

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++对象模型之内存布局(1)

如果想学习在linux或者在linux平台下开发,学习C/或C++是非常好的选择.俗话说,术业有专攻,学一门技术,就尽量学得深,也可以作为行走江湖,混口饭吃的一项本领.对于C,当初我是看了C与指针这门书,这本书讲解了很多我没有了解过的知识点,特别是指针讲解的很到位.最后还设计了C运行时内存模型.对于C++的学习,我看了C++ Primer之后,进阶的书为深入理解C++对象模型,这本书讲解了C++类...

一个人的旅行的博客 286

C++对象模型(1):对象内存布局简介

我们知道当实例化一个类时,也就是产生一个对象时需要分配内存空间.那一个对象具体需要多少字节的内存空间? 通过些什么规则计算出来的?   假如有如下一个类 ------------------------------------------------------------------------------------------------------------------------

weiwenhp 1473

C++知识点总结(面向对象1-类和对象, this指针, 内存布局)

面向对象1-类和对象 C++中可以使用struct, class来定义一个类 struct 和 class的区别:struct的默认成员权限是public class的默认的成员权限是private 变量名规范参考: 全局变量: g_ global g_age 成员变量: m_ member m_age 静态变量: s_ 常量: c_ const 或使用驼峰标识 gAge, mAge 面向对象2- 对象的内存 #include <iostream> using nam

CoderZk的博客 559

【C++学习】 VS2012 使用命令行选项查看对象的内存布局

Nginx学习(一)

谢健的专栏 557

【整理】查看C++对象内存布局

在C++中,一个类实例化得到的结果就是一个对象。一个类包含成员变量和成员函数,成员变量分为non-static和static,成员函数分为non-static成员函数、static成员函数以及virtual成员函数。一个对象包含可能存在的vfptr以及它声明的或基类继承而来的non-static成员变量,static成员变量、static成员函数、non-static成员函数以...

angmoci4456的博客 232

c++虚继承对象的内存布局

c++虚继承对象的内存布局                 --VC7.1特别版 网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside The C++ Object Model 侯捷 译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错: 一是陈皓的《C++ 对象的内存布

imxiangzi的专栏 441

对象内存布局 (11)

前篇:http://blog.youkuaiyun.com/pathuang68/archive/2009/04/23/4103627.aspx 在C++中,一个类实例化得到的结果就是一个对象。一个类包含成员变量和成员函数,其中成员变量又分为nonstatic成员变量和static成员变量;成员函数又可以分为nonstatic成员函数、static成员函数以及virtual成员函数。一个对象包含可能存

玄机逸士的专栏 3228
上一篇: 计算机图形学导论(1)-基础数学
blanckerXHunter
博客等级 码龄11年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值