类型双关联合体(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;探讨其…

【Leetcode】top 100 二叉树

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

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&…

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…

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

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

最大的开源大模型:马斯克的Grok-1可供企业商用

由马斯克xAI团队研发的最大的开源大语言模型Grok-1&#xff0c;从头开始训练的总参数量为314B&#xff08;3140亿&#xff09;的混合专家&#xff08;MoE&#xff09;模型&#xff0c;其规模超过ChatGPT-3.5&#xff0c;目前Grok背后代码和权重架构已全部开放上线在GitHub。 下…

SqlServer服务启动报错10013

错误提示&#xff1a;MSSQLSERVER 服务启动异常不错10013 Windows不能在本地计算机启动SQLServer(MSSQLSERVER)。有关更多信 息&#xff0c;查阅系统事件日志。如果这是非Microsoft服务&#xff0c;请与服务厂商联系&#xff0c;并 参考特定服务错误代码10013。 解决 1、先禁用…

蓝桥杯 2023 省A 颜色平衡树

树上启发式合并是一个巧妙的方法。 dsu on tree&#xff0c;可以称为树上启发式合并&#xff0c;是一种巧妙的暴力。用一个全局数组存储结果&#xff0c;对于每棵子树&#xff0c;有以下操作&#xff1a; 先遍历轻儿子&#xff0c;处理完轻儿子后将数组清零&#xff08;要再…

网络七层模型之数据链路层:理解网络通信的架构(二)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Linux相关命令(1)

1、找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件&#xff0c;然后把他们重新生成一下。要求只能用一行命令。 find ./ -type f -name "*aaa*" ! -name "*bbb*" -exec touch {} \;文件系统操作命令 df&#xff1a;列出文件系统的整体磁盘使用情况 …

小孔平板应力集中问题matlab有限元编程【源码+PPT讲义】|三节点三角形单元|平面单元|稀疏矩阵 |Comsol网格

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

样本投递技术

投递技术 APT 组织主要以邮件作为投递载体&#xff0c;邮件的标题、正文和附件都可能携带恶意代码。主要的方式是附件是漏洞文档、附件是二进制可执行程序和正文中包含指向恶意网站的超链接这三种。 APT攻击的载荷类型&#xff1a; 文档类&#xff1a;主要是office文档、pdf文…

数组——LEETCODE的第35题(二分法与lower_bound函数)

数组——LEETCODE的第35题&#xff08;二分法与lower_bound函数&#xff09; 本文主要是根据leetcode 35题所写的关于数组的相关内容&#xff0c;主要包括&#xff1a; 数组的的特性leetcode第35题二分法的解题lower_bound函数的使用 文章目录 数组——LEETCODE的第35题&#x…