热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

reinterpret_cast可以更改对象表示吗?

如何解决《reinterpret_cast可以更改对象表示吗?》经验,为你挑选了1个好方法。

我的心智模型reinterpret_cast一直是,将表达式的位序列视为不同类型,并且cppreference(注意:这不是C++标准中的引用)似乎同意这一点:

不像static_cast,但是const_cast,reinterpret_cast表达式不会编译到任何CPU指令.它纯粹是一个编译器指令,它指示编译器将表达式的位序列(对象表示)视为具有new_type类型.

寻找保证,我偶然发现[expr.reinterpret.cast]下的一个注释:

[  注意:由may执行reinterpret_­cast或可能不执行的映射会生成与原始值不同的表示.-  结束说明  ]

这让我想知道:在哪个条件下reinterpret_cast产生的值与对象表示不同于原始值?



1> geza..:

这是一个例子:如果您阅读第4个要点:

指针可以显式转换为足以容纳其类型的所有值的任何整数类型.映射函数是实现定义的.[注意:对于那些了解底层机器的寻址结构的人来说,这并不奇怪. - 结束说明]

现在,它是实现定义的,i这里有什么价值:

void *ptr = ;
uintptr_t i = reinterpret_cast(ptr);

它可以是任何东西,只要reinterpret_cast荷兰国际集团i前,我们会得到ptr.

表示ptri可能不同.标准只是说价值i应该"不足为奇".甚至,如果我们reinterpret_cast ptr使用更宽的整数(例如,如果指针是32位,则转换为unsigned long long int),则表示必须不同,因为变量的大小不同.

所以我认为cppreference描述是误导性的,因为可能有reinterpret_casts,它实际上需要CPU指令.


这是另一个案例(由IInspectable发现),Keith Thompson的评论:

用于Cray向量机的C编译器,例如T90,做类似的事情.硬件地址为8个字节,指向8个字节的字.void*和char*在软件中处理,并在字内增加3位偏移量 - 但由于实际上没有64位地址空间,因此偏移量存储在高位3位64位字.因此char*和int*的大小相同,但具有不同的内部表示 - 并且假定指针"真的"只是整数的代码可能会严重失败.

char *并且int *在Cray T90上有不同的表现形式,所以:

int *i = ;
char *c = reinterpret_cast(i);

在这里,i并且c将对Cray T90有不同的表示(并且这种转换肯定使用CPU指令).

(我已经验证了这一点,Cray C/C++参考手册SR-2179 2.0的第3.1.2.7.1章)


@NeilButterworth:给定`#include `/`uint64_t foo(void*x){return reinterpret_cast (x); 用`c ++ -O3 -m32 -S`调用的Apple LLVM 9.1.0(clang-902.0.39.2)生成`movl 8(%ebp),%eax` /`xorl%edx,%edx`,因此服用作为输入一个四字节对象并产生一个八字节对象作为输出.
推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
author-avatar
育诚家瑋逸群
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有