用memcpy替换reinterpret_cast

问题描述 投票:0回答:2

我有一些遗留代码,其中包含以下代码行:

uint16_t* data = reinterpret_cast<uint16_t*>(array_.data()); // #1

array_
类型为
std::vector
。到目前为止,我了解到我们将指向向量第一个元素的指针存储到数据中,并告诉编译器将其视为 uint16_t。

由于某些原因,我希望用 memcpy 替换 reinterpret_cast。

我附带了以下替换行:

uint16_t* data;
memcpy(&data, typed_array_.data(), bytes_per_elem); // #2

bytes_per_elem
向量元素的大小(以字节为单位)。

我不太熟练使用reinterpret_cast和memcpy,所以我想知道,我可以将#1和#2视为等效吗?

c++ memcpy
2个回答
0
投票

memcpy
并不真正关心指针的类型。一旦使用 memcpy,您就放弃了对数据类型的任何编译器检查。编译器不知道
array_.data()
指向的任何类型最终都会出现在您的
uint16_t*
中。

所以这非常相当于

reinterpret_cast
,它也完全忽略类型并盲目地按照您的要求分配指针。如果
reinterpret_cast
是安全的,那么
memcpy
也是安全的。

但是请考虑您是否真的需要使用 memcpy 来完成此操作。你的数组类型没有更好的方法来做到这一点吗?在不知道你有什么样的阵列的情况下,我无法提供更多建议,但我会调查一下。


-1
投票

不,你的例子并不等同。 array._data(),由reinterpret_cast 访问,为您提供一个指向uint16_t 的指针。假设“数据”只是每个 deference,并且没有对其进行指针算术,您实际上需要这样做:

uint16_t data;
memcpy(&data, typed_array_.data(), bytes_per_elem); // #2

正确的memcpy。 memcpy 复制实际字节,因此您需要为其提供一个指向元素的指针(您为您提供了 uint16_** 作为第一个元素,这导致了垃圾指针)。 memcpy 在这方面实际上是不安全的 - 您无法验证输入或输出是否匹配类型。

© www.soinside.com 2019 - 2024. All rights reserved.