使用memcpy将float数组复制到uint8_t数组是否有效?

时间:2019-02-05 08:04:12

标签: c++

我有一个浮点数组(每个浮点4个字节),我想将数据复制到字节数组(uint8_t)并将其视为字节。稍后,我可能想将字节数据复制回float数组,并再次将其视为用于各种操作的float。这在c ++中有效吗?换句话说,是这样的事情,我将浮点数暂时视为有效字节?

std::array<std::uint8_t, 40> b;
b.fill(0);
std::array<float,10> f;
f.fill(3.14);
std::memcpy(b.data(),f.data(),40);
std::array<float,10> f2;
f2.fill(0);
std::memcpy(f2.data(),b.data(),40);
for(std::size_t i=0;i<10;i++)
{
  std::cout<<f2[i]<<std::endl; //now i want to access the float data
} 

1 个答案:

答案 0 :(得分:6)

是的,基本上没问题 1 。我假设uint8_t为字符类型的别名(在现代平台上也是如此)。浮点数很容易复制,因此明确允许移动它们:

  

[基本类型]

     

2对于平凡的任何对象(基类子对象除外)   可复制的类型T,对象是否持有类型的有效值   T,组成对象的基础字节([intro.memory])可以是   复制到char,unsigned char或std :: byte数组中   ([cstddef.syn])。如果该数组的内容被复制回   对象,该对象随后应保留其原始值。

如果一切检查完毕,标准要求您重新获得花车。为了更加安全,可以添加此检查...

static_assert(std::is_same_v<unsigned char, std::uint8_t>);

...如果您要更改的代码太多。否则,最好使用std::byte来表示您正在处理原始字节。


1 -由When is uint8_t ≠ unsigned char?提供,请参见@Ted Lyngmo