Mus*_*ful 3 c++ casting reinterpret-cast type-punning c++17
我最近 了解到,通过 ing 其地址将 POD 重新解释为不同的 POD 是未定义行为reinterpret_cast。reinterpret_cast所以我只是想知道,如果它不能用于其名称所暗示的用途,那么它的潜在用例可能是什么?
我\xe2\x80\x99ve使用的情况有两种reinterpret_cast:
char*为了序列化或与旧版 API 对话时进行强制转换。在这种情况下,从对象指针的转换char*严格来说仍然是 UB(尽管非常频繁地执行)。你实际上不需要 reinterpret_cast这里 \xe2\x80\x94 你可以使用 \xe2\x80\x94memcpy代替,但是在特定情况下强制转换可能会避免复制(但在重新解释字节首先有效的情况下,memcpy通常不会\xe2\x80\x99t 也不会生成任何冗余副本,编译器对此足够聪明)。
来回转换指针以std::uintptr_t通过旧版 API 序列化它们或对它们执行一些非指针算术。这绝对是一个奇怪的野兽,并且\xe2\x80\x99不会经常发生(即使在低级代码中),但考虑一下人们想要利用给定平台上的指针不\xe2\x80\x99t使用这一事实的情况最高有效位,因此这些位可以用来存储一些位标志。垃圾收集器实现有时会这样做。如果程序员知道指针将始终对齐,例如在 8 字节边界处(因此最低三位必须为 0),则有时也可以使用指针的低位。
但说实话,我\xe2\x80\x99不记得我\xe2\x80\x99实际使用的最后一个具体的、合法的情况reinterpret_cast。它\xe2\x80\x99 绝对是很多年前的事了。
| 归档时间: |
|
| 查看次数: |
2362 次 |
| 最近记录: |