【发布时间】:2021-07-21 13:14:25
【问题描述】:
我的问题是关于解析字节数组的典型过程,如下代码:
struct Header { /* ... */ };
struct Entry1 { /* ... */ };
struct Entry2 { /* ... */ };
void Parse(char* p) {
const auto header = reinterpret_cast<Header*>(p);
p += sizeof(Header);
const auto ent1 = reinterpret_cast<Entry1*>(p);
p += sizeof(Entry1);
const auto ent2 = reinterpret_cast<Entry2*>(p);
}
首先,规范说char* 可以为任何其他指针类型起别名,所以reinterpret_cast<Header*> 是安全的。
但是其他reinterpret_cast statemetns 呢,
他们是否违反了strict aliasing rule,因为p,其类型为char*,已经被别名为Header*?还是安全的,因为p 增加了sizeof(Header)?
谢谢。
【问题讨论】:
-
您可以使用
std::memcpy将字节复制到您的结构中,假设该结构可以简单地复制。如果结构不是可轻松复制的,则需要将字节逐字段解析到结构中。 -
您使用的是什么版本的 C++? C++20 中的规则发生了变化。
-
规范说
char*可以为任何其他指针类型起别名,所以reinterpret_cast<Header*>是安全的。 你有那个倒退。规范说reinterpret_cast<char*>(pointer_to_some_type);是安全的。反过来可能安全也可能不安全。 -
看起来你正在重新发明风团。你做的事情叫做序列化。看看boot serialization 库,它可以帮助你解决这个问题。
标签: c++ language-lawyer