从基本类型转换为非 POD 结构
Casting from basic type to non-POD struct
这个问题是将字节流转换为非 POD 结构是否是未定义的行为。
在这样的地方生成数据的地方,即将 4 个 4 位值打包到一个short
中。
std::vector<unsigned short> v(50);
for(int i<0; k < 50; k++)
{
v[k] = (k%8) | (k+1)%8 << 4 | (k+2)%8 << 8 | (k+2)%8 << 12
}
然后将数据作为字节流传递到第二个模块,并在接收模块中解析。
struct Data
{
Data(unsigned short a, unsigned short b, unsigned short c, unsigned short d)
{
value = (a & 0xF) | (b & 0xF) << 4 | (c & 0xF) << 8 | (d & 0xF) << 12
}
Data(unsigned short v) : value(v) {}
short getA() const
{
return value & 0xF
}
short getB() const
{
return (value >> 4) & 0xF
}
short getC() const
{
return (value >> 8) & 0xF
}
short getD() const
{
return (value >> 12) & 0xF
}
private:
unsigned short value;
}
。
unsigned char* data = ...;
Data* ptr = reinterpret_cast<Data*>(data);
ptr[0].getA();
这是未定义的行为吗?struct Data
的大小与short
相同,但是构造函数和成员函数的存在是否使它成为UB?如果我删除构造函数,它会没问题吗?
你必须通过构造函数来构造一个对象。您不能简单地强制转换字节流,然后假装它会产生一个可用的对象。 对于简单可复制的类型,您可以先创建对象,然后以字节为单位复制,否则需要构造函数调用。
回答你的问题:是的,那就是UB。
是的。但是你可以找到一个简单的替代方案:
std::vector<unsigned short> in(50);
std::vector<Data> out{begin(in), end(in)};
(void) out[0].getA();
out
的构造将从in
的每个元素就地构造Data
对象。您可以信任编译器来优化任何内存副本;)
相关文章:
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 带有 char[] 字段的 POD 结构的 constexpr 构造
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 从基本类型转换为非 POD 结构
- 快速将无符号字符的向量强制转换为POD结构的向量,反之亦然
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 在不使用默认构造函数的情况下声明 POD 结构时,会实例化什么?
- 使用指针算术通过均匀的POD结构
- 如何在标准::映射中try_emplace POD 结构?
- 如何在派生类中初始化继承的模板POD结构
- 如果将键定义为std :: string,则存储在REDIS中的POD结构的验证将失败
- 对齐非 POD 结构的缓存
- 我应该在.h文件中还是在.cpp文件中放置POD结构
- 在非 pod 结构上使用运算符 new + 初始值设定项列表
- (POD 结构、POD 类和 POD)成员的 c++ 隐式类成员初始化
- 如果我将一个POD结构分配给另一个POD组织,是否存在内存泄漏
- 如何在不引起UB的情况下将字节序列重新解释为POD结构
- 是否存在非POD结构优先于类的有效用例
- 如何在将POD结构作为变量传递时初始化它
- 解构变量模板参数中的POD结构