使用reinterpret_cast访问类似“struct {double, int}”的对象

2024-03-19

通过访问对象reinterpret_casted 指针和相关的 UB 已经在这里进行了广泛的讨论。阅读问题和答案后,我仍然不确定是否正确使用 POD 类型的未初始化内存。

假设我想“模仿”

struct { double d; int i; };

通过手动为数据成员分配内存并假设(为了简单起见)之前不需要填充i.

现在,我这样做:

// (V1)
auto buff = reinterpret_cast<char*>(std::malloc(sizeof(double) + sizeof(int)));
auto d_ptr = reinterpret_cast<double*>(buff);
auto i_ptr = reinterpret_cast<int*>(buff + sizeof(double));
*d_ptr = 20.19;
*i_ptr = 2019;

第一个问题:这个代码有效吗?

我可以使用放置new:

// (V2)
auto buff = reinterpret_cast<char*>(std::malloc(sizeof(double) + sizeof(int)));
auto d_ptr = new(buff) double;
auto i_ptr = new(buff + sizeof(double)) int;
*d_ptr = 20.19;
*i_ptr = 2019;

我一定要吗?放置new这里似乎是多余的,因为 POD 类型的默认初始化是无操作(空初始化),并且[基本生活] reads:

类型对象的生命周期T开始于:

(1.1) 按类型正确对齐和大小存储T得到,

(1.2) 如果对象具有非空初始化,则其初始化完成,...

这是不是说寿命*d_ptr and *i_ptr一旦我为它们分配了内存,对象就开始了?

第二个问题:我可以使用 typedouble*(或一些T*) for buff, i.e.

// (V3)
auto buff = reinterpret_cast<double*>(std::malloc(sizeof(double) + sizeof(int)));
auto d_ptr = reinterpret_cast<double*>(buff);
auto i_ptr = reinterpret_cast<int*>(buff + 1);
*d_ptr = 20.19;
*i_ptr = 2019;

or

// (V4)
auto buff = reinterpret_cast<double*>(std::malloc(sizeof(double) + sizeof(int)));
auto d_ptr = new(buff) double;
auto i_ptr = new(buff + 1) int;
*d_ptr = 20.19;
*i_ptr = 2019;

?


饰演 巴里这里说得更好 https://stackoverflow.com/a/51572907/734069, 1&3 为 IN。简短版本:这些代码都不包含任何创建对象所需的语法 http://eel.is/c++draft/intro.object#1.sentence-2。并且您无法访问不存在的对象的值。

那么2和4有用吗?

#2 有效当且仅当alignof(double) >= alignof(int)。但它的作用只是在于它创造了一个double随后是一个int. It does not以任何方式“模拟”那个无名的结构。该结构可以具有任意数量的填充,而在这种情况下,int将立即遵循double.

严格来说,#4 不起作用。buff实际上并不指向新创建的double。因此,指针算术不能用于获取该对象之后的字节 http://eel.is/c++draft/expr.add#4。因此,进行指针算术会产生未定义的行为。

现在,我们谈论 C++严格来讲。很可能,每个编译器都会执行所有这四个(带有上述关于对齐的警告)。

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

使用reinterpret_cast访问类似“struct {double, int}”的对象 的相关文章

随机推荐

  • 不确定 unordered_map 是如何工作的

    我对 unordered map 的工作原理 存储桶是什么以及如何管理它们有点困惑 From 这篇博文 http codeforces com blog entry 21853 unordered map 是向量的向量 我的问题是 假设桶是
  • 如何获取较旧的 Xcode beta 版本?

    我已删除 Xcode 10 beta 3 并升级到 Xcode 10 beta 5 然而 由于this bug https stackoverflow com questions 51602785 xcode 10b5 duplicate
  • 如何在 Office VBA 编辑器中注释和取消注释代码块

    In the VBA editor of Office ALT F11 how do you comment or uncomment a block of code 在 VBA 编辑器中 转到View Toolbars Customise
  • Android Firebase setValue() 权限被拒绝

    这是在 firebase 上定义规则的方式 rules users read true user id write auth uid user id read true 我已经成功地使用 setValue 在我的注册活动中写入了新的用户信息
  • Windows Azure VM (Mac) 为 ios 设备构建 Ionic 应用程序

    我正在使用 Ionic 框架开发 Ionic2 Angular 应用程序 我对 Android 没有任何问题 我的问题是 我可以使用 Windows Azure VM Mac 为 ios 设备构建应用程序吗 I have Win 8 1 O
  • 避免 Xamarin 相机的“确定重试”按钮

    我正在使用来自的相机代码库https github com rasmuschristensen XamarinFormsImageGallery https github com rasmuschristensen XamarinForms
  • 用两个向量排序

    我想知道是否有可能 例如 vector
  • 计算 Pubsub 主题中未确认消息的数量

    我想在来自 pubsub 主题的所有消息都得到确认后执行一项操作 我尝试使用 Stackdriver 监控 API 来衡量 按云区域细分的未确认消息数 但不了解区域过滤器以及为什么需要它 在哪里可以查看我的主题使用的区域 并且由于某种未知的
  • 如何使用 JQL 检索特定状态的问题

    输入 url 或使用curl 运行 例如 https
  • list.count() 与 Counter() 性能

    在尝试查找字符串中一堆字符的频率时 为什么对 4 个不同的字符运行 string count character 4 次会比使用 collections Counter string 产生更快的执行时间 使用 time time 背景 给定
  • 如何在iOS 4中启用后台iPod控件来控制非iPod音乐?

    我想要完成的一个很好的例子是在最新版本的SpotifyiPhone应用程序 Pandora似乎有相同的功能 当 Spotify 在后台时 双击会打开 多任务坞 其中 iPod 控件 播放 暂停 前进等 允许控制 Spotify 的音乐播放
  • 升级到 Grails 2.3.0 时 RESTful 请求缺少参数

    我正在使用 Grails 和 RESTful 来开发我的 Web 应用程序 一切正常 直到我将应用程序升级到 Grails 2 3 这是我的 UrlMappings 我仍然正常发送请求 提交或做一些其他事情 但在 POST PUT 请求中
  • Bash:使用管道运算符时 Trap ERR 不起作用

    我试图将 stdout 和 stderr 中的所有内容记录到日志文件中 并仍然保留控制台 为此 我只是附加 tee a log file log对每一个命令 但是 如果脚本期间发生任何错误 我还想运行自定义命令 为此 我在脚本的开头添加了以
  • 警告:/etc/php/7.0/mods-available 下不存在模块 ini 文件

    我已经从 ubuntu 卸载了 php7 及其所有模块 当我尝试重新安装模块时 每个 php 模块都会出现以下错误 尽管模块已安装 但由于此错误 它未激活并且无法使用他们 有什么办法可以解决这个问题吗 每个模块的错误 安装时 Not rep
  • 来自数据库的实体生成器

    我需要在春天从现有数据库生成基于注释的实体 我尝试过骄傲 但生成的实体没有注释 我如何在基于骄傲的实体中生成注释 或者任何人都可以建议我一个好的实体生成器 我想说我也尝试过spring roo 您可以尝试 Telosys Tools 这是一
  • C++ 有什么方法可以以编程方式检测 POD 结构吗?

    我有存储 POD 结构的数据结构 每个实例化仅存储单个类型 因为它基本上是特定 POD 结构的数组 有时另一个开发人员 将修改这些结构之一 添加或修改数据类型 如果添加非 POD 元素 例如std string 数据结构在运行时崩溃 因为内
  • 如何禁用颤动开关

    在我的帮助屏幕中 我有这个开关 其目的是不执行任何操作 只是按原样显示 但我现在遇到的问题是 即使它没有做任何事情 用户也可以拖动开关 所以我试图弄清楚如何禁用它 以便没有人可以拖动开关按钮 return Container child C
  • C# 中的激活函数列表

    我可以在数学中找到激活函数列表 但在代码中却找不到 所以我想如果应该有这样一个列表的话 这将是代码中放置这样一个列表的正确位置 从这两个链接中算法的翻译开始 https en wikipedia org wiki Activation fu
  • 将进度条改为双倍

    进度条 ProgressBar pb ProgressBar findViewById R id progressbar pb setProgress 0 int k int max pb setMax k int j int cost p
  • 使用reinterpret_cast访问类似“struct {double, int}”的对象

    通过访问对象reinterpret casted 指针和相关的 UB 已经在这里进行了广泛的讨论 阅读问题和答案后 我仍然不确定是否正确使用 POD 类型的未初始化内存 假设我想 模仿 struct double d int i 通过手动为