将原始字节转换为任何数据类型
Cast raw bytes to any datatype
我担心我的实施是否不安全或是否可以改进。假设我有一个字节数组(更具体地说,std::byte
);将元素的地址转换为空指针,然后再转换为任何数据类型是否安全?
template <typename To>
constexpr To *byte_cast(std::byte &From) {
return static_cast<To *>(static_cast<void *>(&From));
}
// or rather
template <typename To>
constexpr To *byte_cast(std::byte *From) {
return static_cast<To *>(static_cast<void *>(From));
}
我正在避免 reinterpret_cast
因为它不可靠。请注意,我希望 T *
保留与它所转换的字节相同的地址。
我确实记得数组可能不适合数据类型,或者字节顺序可能会导致问题,但在我的问题得到回答后两者都会得到解决。
您配对的 static_cast
完全等同于 reinterpret_cast
。由于严格的别名违规,两者都会导致 UB(目标类型为 char
、unsigned char
或 std::byte
时除外)。
解决方案是std::bitcast<T>(source)
。它的界面与您尝试的界面相似,只是它按值 returns。不可能有一个 return 和 pointer/reference.
的“安全 reinterpret_cast
”
一个不太现代的选择是 std::memcpy
。
我担心我的实施是否不安全或是否可以改进。假设我有一个字节数组(更具体地说,std::byte
);将元素的地址转换为空指针,然后再转换为任何数据类型是否安全?
template <typename To>
constexpr To *byte_cast(std::byte &From) {
return static_cast<To *>(static_cast<void *>(&From));
}
// or rather
template <typename To>
constexpr To *byte_cast(std::byte *From) {
return static_cast<To *>(static_cast<void *>(From));
}
我正在避免 reinterpret_cast
因为它不可靠。请注意,我希望 T *
保留与它所转换的字节相同的地址。
我确实记得数组可能不适合数据类型,或者字节顺序可能会导致问题,但在我的问题得到回答后两者都会得到解决。
您配对的 static_cast
完全等同于 reinterpret_cast
。由于严格的别名违规,两者都会导致 UB(目标类型为 char
、unsigned char
或 std::byte
时除外)。
解决方案是std::bitcast<T>(source)
。它的界面与您尝试的界面相似,只是它按值 returns。不可能有一个 return 和 pointer/reference.
reinterpret_cast
”
一个不太现代的选择是 std::memcpy
。