【发布时间】:2020-02-10 12:31:33
【问题描述】:
据我所知,所有这样做的“传统”方式,即指针的reinterpret_cast 和带有int 和float 字段的union 都是UB,因为它违反了严格的别名(in C++, not in C) .
那么,如何在没有未定义行为的情况下正确地做到这一点?
我可以对char * 执行reinterpret_cast 并将其存储到uint32_t 吗?或者std::launder 会有所帮助吗?
【问题讨论】:
-
如果您只想“获取”位表示,您可以简单地将指向
float的指针转换为const unsigned char *并使用生成的指针来检查对象的字节。但是你为什么提到“memcpy that to float”?复制到float没有得到位表示;它正在改变位。你真正想做什么? -
在 cppcon 2019 上有一个关于这个问题的 1h talk。您可能对此感兴趣。
-
@EricPostpischil 是的,对不起,我的意思是'memcpy to uint32_t`,我会编辑问题。
-
memcpy that to uint32_t- 你为什么要这样做来打印位?您可以从char打印它们。 -
@KamilCuk 好吧,我想让它们作为一个连续的东西,以获得有效和指数;从 char 数组中获取它们会有点乏味。
标签: c++ strict-aliasing type-punning stdlaunder