C++ 标准在哪里描述了指向原语的指针的转换?

2024-02-14

在优秀的博客文章中每个程序员都应该了解关于未定义行为的知识 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html,“违反类型规则”部分说:

将 int* 转换为 float* 并取消引用它(访问“int”就好像它是“float”一样)是未定义的行为。 C 要求通过 memcpy 进行此类类型转换:使用指针强制转换是不正确的,并且会导致未定义的行为。其规则非常微妙,我不想在这里详细介绍(char* 有一个例外,向量具有特殊属性,联合会改变事物等)。

我想全面了解这些规则的细微差别。它们在 C++11 规范中的什么位置?或者如果做不到这一点,C 规范(C90、C99、C11)?

在链接自的 C++11 规范中这个堆栈溢出问题 https://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents,N3485,我正在查找 5.2.10“重新解释强制转换”,但没有看到 char* 或联合的异常语言。所以那可能不是正确的地方。那么正确的地方在哪里呢?


您要查找的规则位于 §3.10/10(在 C++11 中):

如果程序尝试访问对象的存储值 通过除以下类型之一之外的左值 行为未定义: — 对象的动态类型,

— 对象动态类型的 cv 限定版本,

— 与对象的动态类型类似的类型(如 4.4 中定义),

— 与对象的动态类型相对应的有符号或无符号类型, — 与动态类型的 cv 限定版本相对应的有符号或无符号类型 的物体,

— 聚合或联合类型,其元素或非静态中包含上述类型之一 数据成员(递归地包括子聚合的元素或非静态数据成员 或包含联合),

— 一个类型,它是对象动态类型的(可能是 cv 限定的)基类类型,

— char 或 unsigned char 类型。

未定义有不同的类型(或动机) 行为。

在铸造的情况下int* to float*进而 取消引用它,很明显该标准无法定义 它,因为可能发生的情况取决于架构,并且 的价值int。另一方面,引用的段落 是完全错误的——使用memcpy进行转换是 出于大致相同的原因,还有未定义的行为。

未定义行为的动机之一是 允许实现以有意义的方式定义它 对于目标架构,if这样的存在。这是这样的 一个案例。故意导致其失败的编译器是 有缺陷的。当然,如果我们假设 32 位 2 的补码int和 32 位 IEEEfloat,我们可能期望某些值 这int对应于捕获NaN,这将导致程序 失败。这是该行为的部分原因 不明确的;允许这样的事情发生。但如果我们是 熟悉硬件的底层细节, 它should按预期工作,provided编译器可以看到 演员阵容。 如果没有,这是编译器的 QoI 问题,诸如此类 应避免使用编译器来完成此类工作。

正如上面所暗示的,这个特殊情况,事实上,在所有情况下 涉及类型双关的案例(写信给 例如,一个联盟,并从另一个联盟那里阅读),请摆出姿势 该标准尚未找到充分解决的问题 措辞。出现这个问题的原因是编译器通常是 允许假设指向不同类型的指针(除了 字符类型)不要别名;那一个int*永远不能指向 与 a 相同的对象float*。并证明两个指针 不能使用别名对于优化很重要。一个编译器 破坏指针转换或联合清晰可见的代码 只是被破坏了,即使标准说这是未定义的行为。 编译器会破坏代码,它所看到的只是两个指针 不相关的类型是可以理解的,即使在 标准表示该行为已明确定义。

Using memcpy通过使用两种不同的方式避免了这个问题 没有别名的对象。还是遇到未定义的情况 行为,因为将位模式int into a float,然后访问浮动,没有任何定义 行为。 (反之亦然;我知道至少有一台机器 复制 a 的位float进入一个int可能会导致 非法的int value.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 标准在哪里描述了指向原语的指针的转换? 的相关文章

  • 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入

    我有时用Caliburn Micro http caliburnmicro com创建应用程序 使用最简单的 BootStrapper 我可以像这样使用 IoC 容器 SimpleContainer private SimpleContai
  • 如何转发声明要在 unique_ptr 的标准容器中使用的类

    在智能指针的标准容器中使用它时 是否可以避免完整的类定义可见 例如 我无法编译以下内容 include
  • 命名管道客户端无法连接到作为网络服务运行的服务器

    我有一个服务在网络服务帐户下运行 该服务只是设置一个命名管道并侦听连接 NamedPipeServerStream listeningPipe new NamedPipeServerStream ourservicepipe PipeDir
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 如何生成可变参数包?

    给定不相关的输入是否可以生成非类型参数包 我的意思是 我想改变这一点 template
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • Cookie 在 ASP.net 中失去价值

    我有以下设置 cookie 的代码 string locale DropDownList this LoginUser FindControl locale SelectedValue HttpCookie cookie new HttpC
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 快速将文本附加到文本框

    我有一个BackgroundWorker正在发布消息的线程 使用BeginInvoke在 GUI 中的文本框中 方法 write debug text 在文本框中显示文本使用AppendText并将文本写入Console 外观上是这样的Ba
  • 如何在realm-dotnet中存储System.Collections.Generic.Dictionary

    我正在尝试将 Realm NET 集成到我的 uwp 项目中 我想知道是否有任何方法可以在 Realm dotnet 库中存储 System Collections Generic Dictionary 我试过这个 public class
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 如何使用实体框架设置连接字符串

    我将 EF6 与 MySQL 结合使用 并有一个用于多个数据库的模型 我希望能够在我的表单中设置连接设置 如何以编程方式设置模型的连接字符串 你应该使用EntityConnectionFactory这就是您所需要的 public strin
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • 安全通道支持 WSL 中发生错误[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 wsl install Windows Subsystem for Linux is already installed An err
  • 过滤掉配置文件结果中的文件

    Is there any way to filter out some files from collecting CPU profiles in or just filter them out in CPU profile results
  • 如何在网卡上发送pcap文件包? [复制]

    这个问题在这里已经有答案了 我有一些网络流量捕获的 pcap 文件 并希望在 NIC 上发送其数据包 是否可以 有什么应用程序可以做到这一点吗 您应该能够使用某种重播应用程序 例如tc预播放 http tcpreplay synfin ne
  • 如何删除 input[type="date"] 的占位符文本?

    我有一个input type date 具有最小 最大范围 我想要实现的是隐藏自 dd mm yyyy 起以任何语言显示的占位符文本 到目前为止所尝试的是添加以下 CSS input type date in range webkit da
  • SQL注入保护-单引号[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • 来自电子邮件的 Google 帐户图片

    是否可以像 Gravatar 图像一样检索 Google 帐户个人资料图像 我认为 如果找不到头像 故障转移到 Google 图像会非常方便 如果您能够获取 Google user id 则可以检索 Google 图片 https stac
  • WebApi 异步与同步

    我是 Net WebApi 的新手 因为我知道使用异步 API 而不是同步 API 更好 但有什么区别呢 如果 API 是同步的并且已从客户端调用 并且从另一个客户端调用 正如我所检查的 不会发生中断 并且两个调用将同时进行 那么 将其设为
  • “utf-8”编解码器无法解码位置 4 中的字节 0xe9:数据意外结束

    我对这种语言很陌生 在通过 python 发送电子邮件时遇到了一些麻烦 我的代码如下所示 import smtplib server smtplib SMTP smtp gmail com 587 server starttls serve
  • 连接到远程 IPython 实例

    我想在一台机器上运行 IPython 实例 并从不同的进程连接到它 通过 LAN 以运行一些 python 命令 我知道 zmq 是可能的 http ipython org ipython doc dev development ipyth
  • 信号量简单示例[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 谁能分享使用信号量的简单示例吗 如果
  • Type 对象属性的 TypeConverter

    我需要在属性网格中正确显示对象 我的班级看起来像这样 public class PropertyItem public PropertyDescription PropertyDescription get set Description
  • 如何在打字稿中使用枚举作为索引键类型?

    考虑下面的例子 enum DialogType Options Help class Dialog test string return class Greeter openDialogs key in DialogType Dialog
  • 如何编辑 mp3 文件详细信息 (Delphi)

    我如何使用 delphi 编辑 mp3 文件详细信息 例如描述 标题 副标题 评级 艺术家 有什么组件可以做到这一点吗 谢谢 您也许不仅可以操作 ID3V1 还可以操作 ID3V2 所以 这个库可以帮助你 http www 3delite
  • JSON 对象被 Javascript 重新排序

    我有一个通过 PHP 生成的相当大的 JSON 对象 它从数据库中创建一个 PHP 对象 其键为整数 即 1 100 但这些键并不是按这个顺序排列的 它们是随机排列的 例如 55 72 5 8 14 32 64 等 然后我使用 json e
  • 如何在Java中重写数组的equals?

    我希望覆盖 int 数组的 equals 使得以下内容为真 int a 1 2 3 int b 1 2 3 System out println a equals b 有没有办法做到这一点 覆盖equals的方法int 既不可能 也没有必要
  • 在 Visual Studio 2012 中将新的异步/等待模式与 Windows 窗体设计器结合使用

    我正在尝试在 Visual Studio 2012 中使用新的 Async Await 模式实现异步调用 当我设置表单 使用表单设计器 然后尝试使用异步方法作为事件处理程序时 编译器会抱怨函数不返回 void 该方法应该返回一个任务 这就是
  • 在Python中合并具有不同文件名的CSV文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对Python真的很陌生 所以这个问题可能有点基础 我有 44 个 csv 文件 它们具有相同的标题和不同的文件名 我想将它们全部合并到
  • 只从 URL 中获取域名?

    我正在尝试从 URL 字符串中提取域名 我几乎拥有它 我正在使用 URI 我有一个字符串 我的第一个想法是使用 Regex 但后来我决定使用 URI 类 我需要将上面的内容转换为 google com 和 google 而不带 www 我做
  • Flutter:定义自定义 TextStyles 以在整个应用程序中使用

    如何定义一小组自定义文本样式 然后可以在我的应用程序中重复使用它们 自定义文本样式应基于主题中定义的文本样式 我知道如何创建单独的 TextStyles 例如 Theme of context textTheme title copyWit
  • C++ 标准在哪里描述了指向原语的指针的转换?

    在优秀的博客文章中每个程序员都应该了解关于未定义行为的知识 http blog llvm org 2011 05 what every c programmer should know html 违反类型规则 部分说 将 int 转换为 f