几乎所有 pod 数据都可以用reinterpret_cast(布局兼容性是否足够)

2023-11-27

我正在尝试了解static_cast and reinterpret_cast.

如果我是正确的,标准(9.2.18)说的是reinterpret_castpod 数据是安全的:

指向 POD 结构对象的指针, 使用适当转换reinterpret_cast, 指向其 初始成员(或者如果该成员是 位域,然后到其中的单位 它驻留),反之亦然。 [注:因此可能有未命名的 在 POD 结构对象内填充,但不在其开头,这是实现所需的 适当的对齐。 - 结尾 笔记 ]

我的问题是如何严格地解释这一点。例如,布局兼容性是否足够?如果没有,为什么不呢?

对我来说,以下示例显示了严格的“仅 POD 有效”解释似乎是错误的示例。

class complex_base  // a POD-class (I believe)
{
public:  
  double m_data[2];
};

class complex : public complex_base
{  //Not a POD-class (due to constructor and inheritance)
public:
  complex(const double real, const double imag); 
}

double* d = new double[4];
//I believe the following are valid because complex_base is POD
complex_base& cb1 = reinterpret_cast<complex_base&>(d[0]);  
complex_base& cb2 = reinterpret_cast<complex_base&>(d[2]);
//Does the following complete a valid cast to complex even though complex is NOT POD?
complex& c1 = static_cast<complex&>(cb1);
complex& c2 = static_cast<complex&>(cb2);

另外,如果complex_base::m_data受到保护(意味着complex_base不是 pod)? [编辑:以及我如何保护自己/检测此类破损]

在我看来,布局兼容性应该足够了 - 但这似乎不是标准所说的。

编辑: 感谢您的回答。他们还帮我找到了这个,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm


我相信以下内容是有效的,因为complex_base是POD

您错了。d[0]不指的是第一个成员complex_base目的。因此,它的对齐可能不够好complex_base对象,因此这样的强制转换是不安全的(并且您引用的文本不允许)。

即使complex不是POD,以下内容是否完成了对complex的有效转换?

cb1 and cb2不指向类型对象的子对象complex,因此static_cast产生未定义的行为。参考C++03的5.2.9p5

如果类型“cv1 B”的左值实际上是类型 D 的对象的子对象,则左值引用类型 D 的封闭对象。否则,强制转换的结果是未定义的。

仅将所涉及的类型组合在一起是不够的。文本讨论了指向 POD 结构对象的指针和引用某个子对象的左值。 其余的complex 和complex_base 都是标准布局对象。 C++0x 规范说,而不是您引用的文本:

POD-ness 要求是否太严格?

这是一个不同的问题,与您的示例代码无关。是的,对 POD 性的要求太严格了。在 C++0x 中,这一点得到了认可,并给出了更宽松的新要求,即“标准布局”。我确实认为两者complex and complex_base是 C++0x 定义的标准布局类。 C++0x 规范说,而不是您引用的文本:

指向标准布局结构对象的指针(使用reinterpret_cast进行适当转换)指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。

我将其解释为允许将指针强制转换为double,它实际上指向一个complex成员(继承成员),被强制转换为complex*。标准布局类是一种没有包含非静态数据的基类,或者只有一个包含非静态数据的基类的类。这样就有了一个独特的“初始成员”。

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

几乎所有 pod 数据都可以用reinterpret_cast(布局兼容性是否足够) 的相关文章

随机推荐

  • 为什么 String.IndexOf 和 String.Contains 在提供阿拉伯文本时不一致?

    我想知道我是否在 NET Framework 中发现了错误 或者我是否不明白某些内容 运行这段代码后 var text var word bool exist text Contains word int index text IndexO
  • Composer 2,您的某些插件似乎与它不兼容

    我尝试从 magento 市场安装扩展 但出现不兼容错误 问题1 magento composer root update plugin 已锁定到版本 1 0 0 并且未请求更新此包 magento composer root update
  • 如何自定义要在“添加更多 portlet”菜单中显示的 portlet

    我需要自定义哪个 portlet 出现在 添加更多 portlet 菜单 中 如下图所示 我需要根据登录的用户或站点 社区 限制此菜单中显示的 portlet 数量 这样 站点所有者或站点管理员将能够仅将全能管理员为他们决定的那些 port
  • 计算并显示页面加载进度百分比

    我有一个加载器 它在页面开始加载时加载 我需要显示其中的完成百分比 我的应用程序包含大量 jquery 和 css 并且还包含 ajax 调用 到目前为止 我已经在页面加载开始时显示进度条 并在 ajax 成功完成时隐藏它 另外 我已经显示
  • 在 Linux 中使用 C 语言使用原始套接字进行数据包嗅探

    我需要在 Linux 中编写一个数据包嗅探器来检测发送的 HTTPS 数据包并保存请求中的 url 我在中找到了这方面的代码安全狂并运行它 该代码运行并且仅嗅探接收到的数据包 但我需要在嗅探器中获取发送的数据包 如何获取这段代码中发送的数据
  • mvn 包因所需工件丢失而失败,即使它存在于我的远程存储库中

    我正在尝试奔跑mvn清理包在我的 Maven 项目上 它失败并显示以下消息 工件 net ezswitch ResourcesComponent jar 0 0 14 的 所需工件缺失 我已经配置了我的设置 xml包括我的远程存储库 如果我
  • 从纯 Lua 创建新的空用户数据

    我想我在 Lua 中的某个地方看到了一个可以返回新用户数据的本机函数 它存在吗 是否可以从普通 Lua 脚本创建自定义用户数据 你可能在想newproxy From http lua users org wiki HiddenFeature
  • Windows 任务管理器中的“VM 大小”是什么意思? [关闭]

    Closed 这个问题是无关 目前不接受答案 从计算机大小的角度来看 虚拟内存是 制作程序的一种方法 想想吧 有大范围的连续 地址 但实际上它的部分 目前使用的都是分散的 RAM 周围 不活动的部分是 保存在磁盘文件中 维基百科 我将 Wi
  • Matlab 中的范围界定如何工作?

    我刚刚发现 令我惊讶的是 调用以下函数 function foo if false fprintf 1 else do nothing end fprintf test 给出和错误Undefined function or variable
  • Tkinter、透明背景、Linux

    有没有办法在 Linux 上的 Tkinter 窗口中获得透明背景 我目前看到的唯一方法是 import tkinter as tk root tk Tk root overrideredirect True root wait visib
  • socket.error: [Errno 13] 创建假电子邮件服务器时权限被拒绝

    我正在尝试创建一个假电子邮件服务器作为 Flask 应用程序的一部分 以使用以下脚本在控制台上打印错误 但是 它会引发错误 我怎样才能解决这个问题 dpadmins MacBook microblog presentation python
  • GooglePlaces API“我们无法理解的响应”错误

    将标准自动完成代码与搜索栏一起使用 placesClient autocompleteQuery searchBar textField text bounds nil filter filter callback results erro
  • 是否可以在 字段中放置链接?

    是否可以在此处放置登录和注册链接
  • 如何确定最佳线程堆栈大小?

    实际上 有两种大小 初始承诺和总保留 您使用静态分析还是动态分析 哪些工具 哪些技术 一种技术是在 main 或线程 main 中使用已知值绘制堆栈 然后在清理时从堆栈限制进行扫描 直到不再找到已知值 您的堆栈末端将被定义为符号 生成一个
  • 从 IDE 禁用 C++ PDB 生成

    我们需要抑制调试符号的生成 项目属性 配置属性 c c 常规 调试信息格式下可用的选项相当于 Z7 Zi 和 ZI 我找不到完全省略 Zx 标志的方法 Unlike 这里的情况 我们正在从 IDE 进行构建 我使用的是Visual Stud
  • 生成 JavaScript 数组的排列[重复]

    这个问题在这里已经有答案了 我在 javascript 中有一个由 n 个不同元素组成的数组 我知道有 n 个 对这些元素进行排序的可能方法 我想知道生成该数组的所有可能顺序的最有效 最快 算法是什么 我有这个代码 var swap fun
  • python 3.9.5 中的相对导入

    我的文件夹结构如下 fff init py fg init py settings init py settings py obng test py 我想将 fg settings 中的 settings py 作为模块导入到 test p
  • ThreeJS 停止渲染

    我正在使用 ThreeJS 处理具有 OrbitControls 的基本 3d 场景 一切都很好 除了它导致我的整个网站滞后 因为即使用户没有看它 它也会自行循环 我想要一个函数 当满足某些条件时 在这种情况下 用户没有查看画布 我可以调用
  • 在 Java 中通过正则表达式查找最后一个索引

    我有一根绳子 O O O 我想找到最后一个 来分割字符串 第一次尝试是 POL 但这让它包含了 O 这是显而易见的 有人给点建议吗 我同意使用标准 String lastIndexOf 方法是最好的做法 但我最近使用了 Regex 部分 即
  • 几乎所有 pod 数据都可以用reinterpret_cast(布局兼容性是否足够)

    我正在尝试了解static cast and reinterpret cast 如果我是正确的 标准 9 2 18 说的是reinterpret castpod 数据是安全的 指向 POD 结构对象的指针 使用适当转换reinterpret