Modern C++ sizeof(std::tuple)的秘密

1. 前言

我们曾经至少三篇帖子或多或少的提到过std::tuple的原理及占用空间大小:

  1. Modern C++ std::tuple的size
  2. Modern C++利用工具快速理解std::tuple的实现原理
  3. GDB调试技巧实战–自动化画出类关系图
  4. Modern C++ std::unique_ptr的实现原理

但是,当初在第一篇中提出的size的问题还悬而未决,今天我将着重讲这一块,同时也会讲一些tuple的实现代码。

2. 类继承 VS 类has-a

2.1 一般继承与有一个父对象

考虑下面的两片代码:

struct Base {int i;
}; struct Derived1 : Base
{int j;
};
struct Base {int i;
}; struct Derived1
{Base b;int j;
};

本质上没有什么区别,第一种是继承Base, 也相当于has a Base。它们的sizeof大小也相同。
加强训练下,猜下下面的程序的输出???:

#include<iostream>
#include <tuple>
using namespace std;struct Base {int i;
}; // empty classstruct Derived1 : Base
{int i;
};struct Derived2 : Base
{int i;
};struct Derived3 : Derived2, Derived1
{
};int main()
{Derived3 d;std::cout<<sizeof(d)<<std::endl;
}

我没有给初始化,所以i的值比较随机,这反而能看出我们真的有4个i, 特别是Base.i有两个:

(gdb) p d
$1 = {<Derived2> = {<Base> = {i = -10544}, i = 32767}, <Derived1> = {<Base> = {i = 0}, i = 0}, <No data fields>}

2.2 继承空类 VS 有一个空类对象

但是,如果把Base换成空类哪?如果没有优化,第一种情况还相当于has a Base其大小是1,加上一个int总共8字节(有对其)。但历史没有假设,标准还偏偏允许有优化:Empty base optimization
继承的情况大小为4字节,比has a情况少用4个字节!

2.3 std::tuple中放空类对象 – 继承空类

一言以蔽之:std::tuple正是用了继承而非has a 而节约的空间。
我们举个例子,就举《Modern C++ std::unique_ptr的实现原理》中的例子吧,std::unique_ptr的本质是std::tuple<int*, std::default_delete>, 它的大小是指针的大小8,而不是16. 写个程序验证一下:

#include<iostream>
#include <tuple>
#include <memory>
using namespace std;int main()
{int i=5;std::tuple<int

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

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

相关文章

【INTEL(ALTERA)】错误:*.onchip_flash_0:UFM 扇区不支持“隐藏”模式。请更新访问模式设置

说明 由于英特尔 Quartus Prime Standard Edition 软件版本 22.1 存在一个问题&#xff0c;当您针对 10 FPGA Compact 变体英特尔 MAX在片上闪存英特尔 FPGA IP中选择单压缩映像配置模式时&#xff0c;可能会出现以下错误消息。 错误&#xff1a;*.onchip_flash_0&#xff1a…

C系列-自定义类型:结构体

&#x1f308;个人主页: 会编程的果子君 ​&#x1f4ab;个人格言:“成为自己未来的主人~” 结构体类型的声明 前面我们在学习操作符的时候&#xff0c;已经学习了结构体的知识&#xff0c;这里我们稍微复习一下。 结构体回顾 结构是一些值的集合&#xff0c;这些值称为成员…

【字节跳动】资深后端开发工程师-平台应用服务

资深后端开发工程师-平台应用服务 上海&#xff5c;正式&#xff5c;研发 - 后端职位&#xff5c;ID&#xff1a;A04493 职位描述 负责商业化基础服务系统能力建设&#xff0c;参与千亿级广告基础数据服务研发和优化&#xff0c;参与广告平台通用组件的设计和实现&#xff1b…

【linux】磁盘相关命令fdisk/lsblk和file

1. fdisk 磁盘分区&#xff0c;查看系统分区。 fdisk 的意思是 固定磁盘(Fixed Disk) 或 格式化磁盘(Format Disk)&#xff0c;它是命令行下允许用户对分区进行查看、创建、调整大小、删除、移动和复制的工具。它支持 MBR、Sun、SGI、BSD 分区表&#xff0c;但是它不支持 GUI…

Docker 数据管理、容器互联、网络与资源控制

一、docker数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷(Data volumes)和数据卷容器(Datavolumes containers)。 1、数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立…

池化设计之数据库连接池

前言 一般数据库操作、主机操作等经常会涉及到会话&#xff0c;什么是会话&#xff0c;会话在日常生活中就是指两个人或者多个人直接的交流&#xff0c;同样的在IT行业会话一般是指客户端和服务端之间的通信交流。比如数据库&#xff0c;如果使用可视化界面做为客户端和数据库…

牛顿法与拟牛顿法

文章目录 牛顿法&拟牛顿法1 牛顿法2 拟牛顿法2.1 对称秩1校正2.2 DFP2.3 BFGS 牛顿法&拟牛顿法 设无约束优化问题&#xff1a; min ⁡ f ( x ) , x ∈ R n \min f(x),{\kern 1pt} \,x \in {R^n} minf(x),x∈Rn 1 牛顿法 基本思想&#xff0c;通过泰勒二阶展开&…

Prometheus 容器化部署

实验部署 工作中是基于kube-api的自动发现 1、创建账户绑定集群 kubectl create serviceaccount monitor -n monitor-sa #创建账户 kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrolecluster-admin --serviceaccountmonitor-sa:…

FileViewer纯前端预览项目Vue2 demo

FileViewer 项目Vue2 demo 本demo基于vue-clijsvue2.x构建&#xff0c;如果您需要vue3版本的demo&#xff0c;请前往main分支。 适用于Vue2 Webpack&#xff0c;本集成方法要求最低Webpack版本为5&#xff0c;也就是Vue Cli Service 5.0.0以上&#xff0c;当然&#xff0c;if…

13.前端--CSS-盒子模型

1.盒子模型的组成 CSS 盒子模型本质上是一个盒子&#xff0c;封装周围的 HTML 元素&#xff0c;它包括&#xff1a;边框、外边距、内边距、和 实际内容 2.边框&#xff08;border&#xff09; 2.1 边框的使用 1、border设置元素的边框。边框有三部分组成:边框宽度(粗细) 边框…

国网四川宜宾供电公司:基于“RPA+AI”融合技术的电网设备隐患缺陷智能化识别应用

推荐单位&#xff1a;国网四川省电力公司宜宾供电公司 本文作者&#xff1a;杨鑫、唐龙、钟睿、李小航、孙雪冬 摘 要&#xff1a;为推进电力企业生产业务数字化转型&#xff0c;提高基层班组数字化运维水平。本文通过一线班组对变电站视频巡视、设备故障判断应用场景需求分析…

C++-内存管理(1)

1. C/C内存分布 首先我们需要知道&#xff0c;在C中的内存分为5个区。 1. 栈 又叫堆栈 -- 非静态局部变量 / 函数参数 / 返回值等等&#xff0c;栈是向下增长的。 2. 内存映射段 是高效的 I/O 映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口 创建…

【2023地理设计组一等奖】基于GIS的桥梁隧道三维建模与可视化

作品介绍 1 设计背景和意义 随着我国基础建设规模不断扩大和深入,构建桥梁可视化管理模型,全面推动智慧桥梁,已成为现代隧道桥梁建设行业的发展趋势。传统的桥梁建模工作需要复杂的算法设计并需要熟练编程实践技能,实现周期长。开发自主知识版权的桥梁建模软件系统或专用插…

在线mockjson

在线mockjson体验地址 在调一个问题的时候&#xff0c;但是问题的数据可能并不能随着想到的场景就变化&#xff0c;譬如说又个数组长度的情况&#xff0c;可能默认的情况下是返回4个元素&#xff0c;但是想要返回为空的时候&#xff0c;如果联系服务给改一下&#xff0c;那么流…

防火墙知识普及详解,使用TOR Router把TOR作为默认网关,增加隐私/匿名性

防火墙知识普及详解,使用TOR Router把TOR作为默认网关,增加隐私/匿名性。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习,切勿用于非法犯罪活动,对于恶意使用该工具造成的损失,和本人及开发者…

Abp 从空白WebApplication开始

开发环境&#xff1a;VS2022、.NET6 1、创建项目&#xff1a;BasicAspNetCoreApplication 2、NuGet添加&#xff1a;Volo.Abp.AspNetCore.Mvc和Volo.Abp.Autofac&#xff0c;如下图所示&#xff1a; 3、开始写代码&#xff0c;目录如下图所示&#xff1a; 3.1、添加启动模块Ap…

使用make_grid多批次显示网格图像(使用CIFAR数据集介绍)

背景介绍 在机器学习的训练数据集中&#xff0c;我们经常使用多批次的训练来实现更好的训练效果&#xff0c;具体到cv领域&#xff0c;我们的训练数据集通常是[B,C,W,H]格式&#xff0c;其中&#xff0c;B是每个训练批次的大小&#xff0c;C是图片的通道数&#xff0c;如果是1…

接口请求,上传文件报500异常

异常响应 {"timestamp": "2024-01-29T06:39:28.82000:00","status": 500,"error": "Internal Server Error","path": "/test/upload" }服务端日志 服务端无日志打印 分析方向 nginx配置 nginx配置…

如何多个excel中的数据分发到多个excel中去

这个问题之前有一个文章我写了这个方法&#xff0c;但是后来发现效率太低了&#xff0c;于是再次更新一下对应的技术方案&#xff0c;提速5000倍。 一下代码主要实现的功能&#xff1a; 我有5000多个excel文件&#xff0c;每个文件是一只股票从上市至今的日K交易数据&#xff0…

Python网络拓扑库之mininet使用详解

概要 网络工程师、研究人员和开发人员需要进行各种网络实验和测试&#xff0c;以评估网络应用和协议的性能&#xff0c;以及解决网络问题。Python Mininet是一个功能强大的工具&#xff0c;它允许用户创建、配置和仿真复杂的网络拓扑&#xff0c;以满足各种实际应用场景。本文…