类型双关联合体(C++基础)

类型双关

类型双关就是在同样的一个内存中,存储的数据可以用做不同类型的表述。用在底层性能优化的时候,一般使用的时候要非常小心,因为不当的使用可能导致程序的不稳定和不可预测的行为。

	int a = 5;//double value = (double)a;double value = *(double*)&a;//会读取到不该读取的内容//value = 0.0;std::cout << value;std::cin.get();

在上述行为的情况下,在大多数编译器和系统会出现未定义行为,因为整数和浮点数的内存布局是不同的,但在修改了value后,上述的a出的内存,因为本质上是一片内存。

struct Entity {int x, y;int* getPosition() {return &x;/*	int* w = new int();w[0] = x;w[1] = y;return w;*/}
};

上述操作中,声明数组指针返回数组指针和声明int类型指针本质是否是一样的?

重新写了代码,运行结果都是一样的,但是含义不同:

delete w和delete[] w在释放内存中是不同的。

并且使用int指针声明,变量值会默认为0,自动初始化,而声明数组的话,需要完成手动初始化。

int main() {Entity x{1,2}; int* y = (int*)&x;std::cout << y[0] << "-" << y[1] << std::endl;int z = *(int*)((char*)&x + 4);std::cout << z;int* u = (int*)((char*)&x + 4);std::cout << u[-1];std::cin.get();
}

上述代码中输出如下:

因为char指针占1个字节,所以挪动4次后会位于2的位置,此时转为int指针类型,就指向Entity对象的y。

联合体

联合体就是两种类型同用一篇内存地址,关键字为union。

 在部分情况下,可以代替类型双关使用:

struct vector2{float x, y;
};
struct vector4 {union {struct {float a, b, c, d;};struct {vector2 x, y;};};float a, b, c, d;vector2& getvector2() {return  *(vector2*)&x;}
};

在这里对联合体和类型双关的表述是类似的。复习了一下符号重载的运用:

std::ostream& operator<<(std::ostream& stream ,const vector2& other) {stream << other.x << "," << other.y;return stream;
}

下面验证一下在联合体中修改联合体的内容:

int main() {vector4 test = {1.0f, 2.0f, 3.0f, 4.0f};std::cout << test.x << "-" << test.y << std::endl;test.c = 50.0f;std::cout << test.x << "-" << test.y << std::endl;std::cin.get();
}

输出显示联合体会修改对应的内存信息导致其他成员变量内容改变!!!

下面验证一下在类型双关中:

	vector4 test = {1.0f, 2.0f, 3.0f, 4.0f};std::cout << test.getvector2() << "-" << *(&test.getvector2() + 1) << std::endl;test.c = 50.0f;std::cout << test.getvector2() << "-" << *(&test.getvector2() + 1) << std::endl;std::cin.get();

修改成功!想法正确!

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

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

相关文章

软考信息系统项目管理师2024上半年报名流程及注意事项

2024年5月软考信息系统项目管理师报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消…

Qt Design Studio 软件怎么用(详细+通俗+有趣)

建议&#xff1a;本文长期更新&#xff0c;建议点赞/收藏&#xff01; 1. 啥是Qt Design Studio&#xff1f; Qt Design Studio 是一个用于设计和开发用户界面的工具&#xff0c;特别适合开发跨平台应用程序。它结合了UI设计和开发的工作流程&#xff0c;使得设计师和开发者可…

桌面显示器PD芯片:引领桌面显示技术的新篇章

随着科技的飞速发展&#xff0c;桌面显示器作为人们日常工作与生活中不可或缺的重要设备&#xff0c;其性能与品质也在不断提升。其中&#xff0c;PD芯片作为桌面显示器中的核心组件&#xff0c;发挥着至关重要的作用。本文将对桌面显示器PD芯片进行详细介绍&#xff0c;探讨其…

如何确定ISO体系认证的范围?越大越好是否合理?

什么叫认证范围 ISO认证范围是指企业在申请ISO体系认证时&#xff0c;确定管理体系所涉及的业务范围。这个范围通常包括产品、服务、活动等方面&#xff0c;是企业为了提升管理水平、增强竞争力而选择实施ISO体系认证时需要考虑的重要因素之一。 ISO体系认证的范围主要包括两…

【Leetcode】top 100 二叉树

基础知识补充 完全二叉树&#xff1a;顺序存储&#xff08;数组&#xff09; 非根节点的父节点序号floor((i-1)/2) 序号i的左孩子节点序号2*i1 右孩子节点序号2*i2 一般二叉树&#xff1a;链式存储 结构&#xff1a;left指针指向左子节点&#xff0c;right指针指向右子节点&am…

JAVA 100道题(17)

17.创建一个方法&#xff0c;接受一个整数作为参数&#xff0c;并检查它是否为正数。如果不是&#xff0c;则抛出自定义异常。 首先&#xff0c;你需要定义一个自定义的异常类。在Java中&#xff0c;你可以通过继承 Exception 类来创建自定义异常。然后&#xff0c;你可以创建一…

区区文件操作

一、概念 数据存到内存中&#xff0c;程序退出、掉电数据就丢失了 数据存到硬盘中&#xff0c;就是存储在文件中&#xff0c;数据就不会因为掉电、程序退出就丢失。想要数据持久化&#xff0c;就要使用文件。 二、分类 什么是文件&#xff1f; 硬盘&#xff08;磁盘&#…

springcloud 复习day2~[条件装配]

条件装配: 注解:Condition 定义一个注解 import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;/*** author Gavin*/ Retention(RetentionPolicy.RUNTIME) Target({ElementType.TYPE, ElementType.METHOD}) Documented Conditional(Lo…

ffmpeg拉流并解码

流程 注意事项 版本不同导致的api差异资源安全释放

激光焊接机在不锈钢三角阀制造中的应用与发展

不锈钢三角阀激光焊接机是一种专门用于焊接不锈钢三角阀的高效、精准设备。这种设备在不锈钢三角阀的制造过程中起到了至关重要的作用&#xff0c;其应用主要体现在以下几个方面&#xff1a; ​ 一、激光焊接机在不锈钢三角阀制造中的应用 激光焊接机以其独特的优势&#xff…

力扣450 删除二叉搜索树中的节点 Java版本

文章目录 题目描述思路代码 题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除…

【CKA模拟题】如何发布一个SVC资源

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesYou have an existing Nginx pod named nginx-pod . Perform the following steps: Expose the nginx-pod internally within the cl…

Gorm连接Mysql数据库及其语法

Gorm连接Mysql数据库及其语法 文章目录 Gorm连接Mysql数据库及其语法前期工作找到Gorm的github项目简单了解相关MySQL语法 启动数据库定义数据库模型注意点Gorm Model定义结构体标签(tag)支持的结构体标记&#xff08;Struct tags&#xff09;关联相关标记&#xff08;tags&…

重庆交通大学2024年蓝桥杯测试赛3题解(AK Java版)

A. 拼成长方体 题目描述: 有n个边长为1的立方体积木(这种立方体称为单位立方体),问可以拼成几种长方体。一个长方体,竖起来、平着放、侧着放,视为同一个长方体。 输入描述: 输入数据占一行,为一个正整数n,n≤1000。 输出描述: 输出每个长方体的长、宽、高,格式…

openGauss学习笔记-251 openGauss性能调优-使用Plan Hint进行调优-行数的Hint

文章目录 openGauss学习笔记-251 openGauss性能调优-使用Plan Hint进行调优-行数的Hint251.1 功能描述251.2 语法格式251.3 参数说明251.4 建议251.5 示例 openGauss学习笔记-251 openGauss性能调优-使用Plan Hint进行调优-行数的Hint 251.1 功能描述 指明中间结果集的大小&a…

Redis持久化策略和优缺点

首先来谈谈什么是持久化&#xff1f; 持久化就是将数据从内存保存到磁盘的过程&#xff0c;其目的就是为了防止数据丢失。 为什么要这样做&#xff1f;因为内存中的数据在重启服务器后就会丢失&#xff0c;而磁盘上的数据则不会&#xff0c;因此为了系统稳定&#xff0c;我们…

蓝桥杯刷题记录之黄金树

思路 需要注意的就是它的节点编号是从1开始的&#xff0c;Node的l和r是int类型&#xff0c;而不是Node类型&#xff0c;因为题目在给定l和r的时候&#xff0c;给的是下标而不是一个node对象&#xff0c;其余的就没有了&#xff0c;树的遍历这个贼简单 代码 import java.util…

学习AIGC大模型的步骤

学习大模型及相关技术&#xff0c;您可以按照以下步骤进行&#xff1a; 基础知识储备&#xff1a; •理解机器学习的基本概念&#xff0c;包括监督学习、无监督学习、强化学习等。 •掌握深度学习的基础理论&#xff0c;包括神经网络的工作原理、反向传播、激活函数等。 •学习…

产品经理面试自我介绍,这3大错误千万别犯!

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;今天这篇产品经理面试干货分享给大家~ 今天文…