7.类的大小

news2024/11/15 21:22:50

对于C++的类而言,类的大小似乎并非完全由用户控制,我们看看如下的代码。

class X {};
class Y : public virtual X{};
class Z : public virtual X{};
class A : public Y, public Z{};

上述的X,Y,Z,A中没有任何一个class内含有明显的数据,其间只表示了继承关系,所以有人认为每个class的大小应该是0。当然不对,即使class X的大小也不是0。下面是测试结果。

GCC x86 64bit

Visual C++ 5.0

sizeof X的结果是 1

sizeof X的结果是 1

sizeof Y的结果是 8

sizeof Y的结果是 4

sizeof Z的结果是 8

sizeof Z的结果是 4

sizeof A的结果是 16

sizeof A的结果是 8

事实上Y和Z的大小受到三个因素的影响:

  1. 语言本身造成的额外负担(overhead) 当语言支持virtual base classes时候,就会造成一些额外的负担。在derived class中,这个额外的负担反映在某种形式的指针上,它或者指向virtual base class subobject,或者指向一个相关的表格;表格种存放的如果不是virtual base class subobject的地址,就是其偏移位置(offset)。
  2. 编译器对特殊情况所提供的优化处理 Virtual base class X subobject的1byte大小也出现在class Y和class Z身上。传统上它被放在derived class的固定部分尾部。某些编译器会对empty virtual base class 提供特殊支持。
  3. Alignment的限制 class Y和Z的大小截至目前是5 bytes。大部分的机器上,聚合的结构体大小会受到alignment的限制,使他们能够有效的在内存上存取。

PS:alignment就是将数值调整到某个数的整数倍。在32位计算机中,通常alignment为4bytes(32位),以使bus的“运输量”达到最高的效率。

Empty virtual base class已经成为C++ OO设计的一个特有术语了。他提供一个virtual interface,并没有定义任何的数据。在GCC x86 64Bit中,一个empty virtual base class被视作derived class object最开头的一部分,也就是说它没有花费任何的额外空间。以下是GCC x86 64Bit编译器对于class X,Y,Z的内存布局:

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

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

相关文章

基本开关稳压器(升压结构+降压结构+逆变结构)

2024-9-14,星期六,7:25,天气:多云,心情:晴。明天就就要迎来三天小长假啦,提前祝大家假期快乐,中秋快乐,幸福美满! 今天继续第11章的学习,主要学习…

FOTA介绍

0 Preface / Foreword 1 FOTA 1.1 FOTA介绍 FOTA:Firmware Over-the-Air (FOTA) 1.2 如何产生FOTA文件 (generate FOTA package) 第一步:打开FOTA package tool 第二步:选择flash download配置文件 文件名:flash_download.cf…

Python 常用模块(一):csv模块

目录 一、csv文件介绍二、csv模块2.1 csv模块介绍2.2 csv 模块的基本功能2.3 reader()方法——读取csv文件2.4 writer()方法——将数据写入csv文件2.5 DictWriter类——创建支持字典的csv文件2.6 DictReader类——创建字典类型的csv文件对象2.7 几个常用属性说明2.7.1 QUOTE_AL…

可怕,就算不点,也能中招!macOS神秘的零点击日历漏洞

你有没有想过,连点击都不需要,你的电脑就可能中招?最近的一个macOS漏洞——“零点击日历邀请漏洞”正是这样,它让人有点毛骨悚然。想象一下,你平时收到的那些日历邀请,可能一不留神就让你的系统陷入危机。而更恐怖的是,你根本不需要做任何操作,攻击就会在你眼皮底下悄无…

开发一款应用程序后要做的四件事

首先恭喜您开发了您的移动应用程序!然而创建高质量的应用程序只是迈向成功的第一步。在当今竞争激烈的市场中,让用户发现您的应用至关重要。这就是应用商店优化 (ASO) 发挥作用的地方。 ASO 是优化应用在 Apple App Store 和 Goog…

ROS2 自定义消息 (ACT模型训练参数化为例)

0. 背景 Ubuntu20.04ROS2 foxyPython3.8 (Anaconda) 项目需要,要将ACT模型训练参数化(GitHub - tonyzhaozh/act)。 Qt UI ROS节点(C):从json配置文件读取训练参数,自定义…

LEAN 赋型唯一性(Unique Typing)之 证明过程简介

LEAN论文在证明赋型唯一性(Unique Typing )时,引入了 n-provability 的概念,通过证明在 n-provability 情况下的赋型唯一性,来证明系统的 赋型唯一性。同时,在证明在 n-provability 情况下的赋型唯一性时&a…

Kubernetes实战——基于Helm安装Redis主从模式

目录 一、Helm介绍 1、三大概念 2、基本命令 二、NFS的安装和使用 1、安装NFS 2、NFS在K8s上使用 三、PV和PVC 1、定义 2、PV和PVC的生命周期 2.1、资源供应 2.2、资源绑定 2.3、资源使用 2.4、资源回收 3、创建PV 4、创建PVC 5、创建测试使用PVC的Pod 四、Stor…

基于Qt的串口调试工具

1.项目地址 https://github.com/zhangjiechina001/SerialPortTool 2.核心类 头文件 #ifndef SERIALPORTWRAP_H #define SERIALPORTWRAP_H #pragma execution_character_set("utf-8") #include <QObject> #include <QSerialPort>class SerialPortWrap :…

TDSQL数据库介绍

TDSQL是什么 TDSQL是腾讯云自研企业级分布式数据库&#xff0c;旗下涵盖金融级分布式、云原生、分析型等多引擎融合的完整数据库产品体系&#xff0c;提供业界领先的金融级高可用、计算存储分离、数据仓库、企业级安全等能力&#xff0c;同时具备智能运维平台、Serverless版本…

70、Python之函数式编程:一文搞懂函数式编程的核心概念

引言 从这篇文章开始&#xff0c;我打算稍微聊一下函数式编程&#xff0c;以及Python中对函数式编程有哪些支持&#xff0c;我们在Python中如何应用函数式编程。虽然不会对函数式编程做一个很详尽的讲述&#xff0c;但也会做一个简短的系列性讲述&#xff0c;以便于Python爱好…

响应式网站真的就只是多了一个媒体查询吗?

响应式网站不仅仅是多了一个媒体查询&#xff0c;而是通过一系列技术和设计理念的结合来实现自适应布局和内容展示。以下将详细分析响应式网站的多个方面&#xff1a; 技术基础 CSS3 Media Query&#xff1a;响应式设计的核心在于使用CSS3的媒体查询&#xff08;Media Query&a…

应用程序已被 Java 安全阻止:Java 安全中的添加的例外站点如何对所有用户生效

如题&#xff1a;应用程序已被 Java 安全阻止&#xff0c;如下图所示&#xff1a; 在寻找全局配置的时候花了一个上午的时间&#xff0c;到处搜解决方法&#xff0c;都不可行。最后还是参考官方的文档配置好了。如果你碰到了同样的问题&#xff0c;这篇文章一定可以帮到你。 环…

QT支持C/C++工业边缘计算网关带RS485、HDMI视频输出

ARM工业控制器是一种在工业领域广泛应用的设备&#xff0c;以下详细分析ARMxy ARM 工业控制器带 HDMI 支持 QT 应用于工业车间数据采集&#xff1a; 一、ARM 工业控制器概述 ARM 架构的优势&#xff1a; 低功耗&#xff1a;在工业环境中&#xff0c;长时间运行的设备需要较低…

uniapp性能优化专题

运行原理 逻辑层和视图层分离&#xff0c;且非 H5 端通信有折损 逻辑层详解 视图层详解 逻辑层和视图层分离的利与弊 app-vue 和小程序的数据更新&#xff0c;分页面级和组件级 优化建议 避免使用大图 优化数据更新 长列表 展示全部 #性能优化专题 #运行原理 #逻辑…

LDR6020,单C口OTG,充放一体新潮流!

PD&#xff08;Power Delivery&#xff09;芯片实现单Type-C接口输入和输出OTG&#xff08;On-The-Go&#xff09;功能&#xff0c;主要是通过支持USB Power Delivery规范和OTG功能的特定硬件和软件设计来实现的。以下是对这一过程的具体解释&#xff1a; 一、PD芯片基础功能 …

海外最新外太空投资理财系统源码

海外最新外太空投资理财系统源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89744826 更多资源下载&#xff1a;关注我。

ARTS Week 38

Algorithm 本周的算法题为 2432. 处理用时最长的那个任务的员工 共有 n 位员工&#xff0c;每位员工都有一个从 0 到 n - 1 的唯一 id 。 给你一个二维整数数组 logs &#xff0c;其中 logs[i] [idi, leaveTimei] &#xff1a; idi 是处理第 i 个任务的员工的 id &#xff0c;…

openmpi 的应用编译使用方式的探讨

0&#xff0c;源码 hello_openmpi.c #include <stdio.h> #include <mpi.h>int main(int argc, char **argv) {printf("1 Hello, world! \n");MPI_Init(&argc, &argv);int rank;MPI_Comm_rank(MPI_COMM_WORLD, &rank);printf("2 Hello…

Java语法1

注释 单行注释// 多行/* */ 字面量 同C \n \t不需要加单引号 数据的存储 十进制转二进制 除2取余法 数据在计算机中的最小存储单位字节1B8b KB MB GB TB 相邻的转换 2的10次方等于1024 字符存进去则存ASSIC编码对应的数,比如49对应’1’,65对应’A’,97对应’a’ 图片,声音…