C++对象模型(3)-- 类对象所占用的空间

news2024/11/6 7:09:20

类对象所占用的空间可以用sizeof()函数获取,在C++对象模型中,类对象所占用的空间规则如下:

(1) 空类占1字节,以使该类对象在内存得以配置一个地址。

(2) 对象所占用的空间由3个因素决定:非静态成员变量、虚函数、字节填充。

我们可以再细化:

(2.1) 静态成员变量,成员函数(静态、非静态)都不计算在sizeof()里。

(2.2) 指针占用的内存大小是固定的,4字节或8字节,具体取决于操作系统是32位还是64位。

(2.3) 虚函数不计算在对象的sizeof内,但虚函数会让对象的sizeof增加4个字节(64位操作系统中是8个字节),因为这时会增加1个虚函数表指针。

(2.4) 字节对齐。

1、空对象占1个字节

class A {
public:
};

int main() {
    A a;
    std::cout << sizeof(a) << std::endl;

    return 0;
}

输出1,说明空对象至少占1字节的内存空间。

2、char变量占1个字节

我们再把这个class A修改一下,添加一个char变量,看看这时对象是多少个字节?

class A {
public:
    char c1;
};

这时依然输出1,那么这个1字节空间是谁的呢?是char c1的。

我们可以再添加1个char c2,看一下这时的对象大小,发现变成了2。所以,我们可以得出1个结论:成员变量char占1个字节。

3、函数不占字节

我们再把这个class A修改一下,添加1个函数,看看这时对象是多少个字节?

class A {
public:
    char c1;
    void func1(){ }
};

发现对象的大小依然是1,所以我们可以得出1个结论:类中的成员函数是不占用类对象内存空间的。

4、指针变量占4个字节(32位环境)

我们给类A增加1个指针变量,并且把char变量删除,看看现在对象的大小。

class A {
public:
    void func1() { }

public:

    int* pI1;
};

这里说明一下,为了简单起见,我们把编译环境统一为x86(32位)。这时输出4,说明:指针占4个字节。不管什么类型的指针,都是4个字节哦。

(如果是64位环境,则指针变量占8个字节)

5、字节填充

我们再把char变量添加进去,看现在的对象大小是多少?

class A {
public:
    void func1() { }

public:
    char c1;
    int* pI1;
};

照理说char的大小是1,指针的大小是4,对象的大小应该是5吧。但实际的输出确是8。

为什么呢?

为了访问速度和性能考虑,这时系统会给char分配4个字节 -- 这叫字节对齐,都往4个字节对齐。

6、虚函数

前面我们数过函数是不占用类对象空间的,那么给类添加1个虚函数后会怎样呢?我们把代码修改一下:

class A {
public:
    virtual void func1() { }

public:
    char c1;
    int* pI1;
};

此时输出12,也就是说1个虚函数让对象增加了4个字节。这是因为增加了1个虚函数指针的原因。

现在类对象的布局应该是这样的:

7、C++基本数据类型的大小

不管是32位还是64位,C++基本数据类型的大小是不变的。

数据类型

字节数

bool

1

char

1

int

4

unsigned int

4

short int

2

long int

8

float

4

double

8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1072521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图形学 -- Rasterization栅格化

参考视频&#xff1a;Lecture 05 Rasterization 1 (Triangles)_哔哩哔哩_bilibili 视锥&#xff1a; 定义一个垂直角度&#xff0c;定义宽高比 投到[-1,1]^3之后要呈现到屏幕上 屏幕 屏幕&#xff08;一个二位数组&#xff09; 屏幕是个典型的光栅成像设备 定义屏幕空间 映…

【每日一练】勾股定理困难版

目录 题目官方给的解题思路源代码附最大公因数辗转相除法更相减损术 所有因数参考文献 题目 给定斜边z的值&#xff0c;求所有直角边x和y的组合数&#xff08;x、y和z都是正整数&#xff09;。 仅有一行输入&#xff0c;即斜边z的值&#xff08;z是正整数&#xff0c;且z<1…

23种经典设计模式:单例模式篇(C++)

前言&#xff1a; 博主将从此篇单例模式开始逐一分享23种经典设计模式&#xff0c;并结合C为大家展示实际应用。内容将持续更新&#xff0c;希望大家持续关注与支持。 什么是单例模式&#xff1f; 单例模式是设计模式的一种&#xff08;属于创建型模式 (Creational Pa…

将本地代码提交到git新仓库

建仓 首先需要新建一个仓库&#xff0c;注意一定要是空仓库&#xff0c;不要选任何初始化 在代码所在目录右击&#xff0c;进入Git Bash Here 初始化git仓库 git init将文件添加进库 git add .进行提交&#xff0c;-m 后面引号中的内容是本次提交内容&#xff0c;自行填写…

STM32F103 最小系统 PCB 设计与原理

这篇文章是来自我学习&#xff1a; ​​​​​​带着你从手册开始画板 STM最小系统板教程系列(一)_哔哩哔哩_bilibili​​​​​​ 这套教程的笔记&#xff0c;同时本文中也参考了其他教程以及我遇到的困惑与自答&#xff0c;最终汇总。 一、单片机最小系统 单片机最小系统是由…

Centos7中安装Jenkins教程

1.必须先配置jdk环境&#xff0c;安装jdk参考 Linux配置jdk 2.先卸载Jenkins # rpm卸载 rpm -e jenkins # 检查是否卸载成功 rpm -ql jenkins # 彻底删除残留文件 find / -iname jenkins | xargs -n 1000 rm -rf 3.安装Jenkins 在 /usr/ 目录下创建 jenkins文件夹 mkdir -p je…

Fastadmin 子级菜单展开合并,分类父级归纳

这里踩过一个坑&#xff0c;fastadmin默认的展开合并预定义处理的变量是pid。 所以建表时父级id需要是pid&#xff1b; 当然不是pid也没关系&#xff0c;这里以cat_id为例&#xff0c;多加一步处理一样能实现。 废话少说上代码&#xff1a; 首先在控制器&#xff0c; 引用…

使用HbuilderX运行uniapp中小程序项目

下载HbuilderX&#xff0c;下载链接&#xff1a; HBuilderX-高效极客技巧 导入相关项目。下载微信开发者工具。使用微信开发者工具打开&#xff1a;注意&#xff1a;如果是第一次使用&#xff0c;需要先配置小程序ide的相关路径&#xff0c;才能运行成功。如下图&#xff0c;需…

国产开源无头CMS,MyCms v4.7 快捷生成接口开发后台

MyCms 是一款基于 Laravel 开发的开源免费的开源多语言商城 CMS 企业建站系统。 MyCms 基于 Apache2.0 开源协议发布&#xff0c;免费且可商业使用&#xff0c;欢迎持续关注我们。技术交流 QQ 群&#xff1a;887522124 加群请备注来源&#xff1a;如gitee、github、官网等 v4…

什么是智能档案柜?如何使用智能档案柜?

智能档案柜是一种具有智能化功能的文件存储设备&#xff0c;它通过应用现代科技&#xff0c;集成了电子锁、自动化控制、智能管理系统技术&#xff0c;具有自动识别、高效存储、安全可靠等特点&#xff0c;提高档案管理的效率和安全性。适用于企业单位、图书馆等需要储存文件资…

(自学)黑客技术方法——网络安全篇

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

JRebel在IDEA中实现热部署 (JRebel实用版)

JRebel简介&#xff1a; JRebel是与应用程序服务器集成的JVM Java代理&#xff0c;可使用现有的类加载器重新加载类。只有更改的类会重新编译并立即重新加载到正在运行的应用程序中&#xff0c;JRebel特别不依赖任何IDE或开发工具&#xff08;除编译器外&#xff09;。但是&…

Pyside6 QRadioButton

Pyside6 QRadioBox QRadioButton使用QRadioButton分组QRadioButton设置文本代码设置界面设置 QRadioButton禁用和启用代码设置界面设置 QRadioButton设置默认值代码设置界面设置 读取QRadioButton状态QRadioButton样式设计代码设置界面设置 完整程序界面程序主程序 QRadioButto…

语音芯片基础知识 什么是语音芯 他有什么作用 发展趋势是什么

目录 一、语音芯片的简介 常见的语音芯片有哪些&#xff1f; 语音芯片的种类有很多&#xff0c;大体区分下来也就4个类别而已&#xff1a; 选型的经验说明如下&#xff1a; 推荐使用flash型语音芯片 一、语音芯片的简介 语音芯片基础知识&#xff1a; 什么是语音芯片&…

计算机竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖&#xff0c;适合作为竞赛课题…

$attrs 和 $listeners (vue2vue3)

目录 透传 Attributes Attributes 继承​ 对 class 和 style 的合并 v-on 监听器继承 深层组件继承 禁用 Attributes 继承 多根节点的 Attributes 继承 vue2 $attrs 和 $listeners $attrs 概念说明 $attrs 案例 $listeners 概念说明 $listeners案例 vue3 $attr…

大数据学习(1)-Hadoop

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博>主哦&#x…

Agilent安捷伦3458A八位半万用表

Agilent 3458A突破了生产测试&#xff0c;科研与开发及校准实验室在速度与精度上长时期的性能 壁垒&#xff0c;是惠普公司提供的快速&#xff0c;灵活且精确的多用表。在你的系统中或工作台上&#xff0c; 3458A以空前的测试系统吞吐量和精度、七种功能的测量灵活性&#xff0…

Ubuntu 18.04 OpenCV3.4.5 + OpenCV3.4.5 Contrib 编译

目录 1 依赖安装 2 下载opencv3.4.5及opencv3.4.5 contrib版本 3 编译opencv3.4.5 opencv3.4.5_contrib及遇到的问题 1 依赖安装 首先安装编译工具CMake&#xff0c;命令安装即可&#xff1a; sudo apt install cmake 安装Eigen&#xff1a; sudo apt-get install libeigen3-…