根据标准 https://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing,在 C++ 中始终是未定义的行为,例如float*
指向与 a 相同的内存位置int*
,然后从中读取/写入。
在我的应用程序中,可能有一个填充有 32 位整数元素的缓冲区,这些元素会被 32 位浮点元素覆盖。 (它实际上包含图像的表示,由 GPU 内核在多个阶段进行转换,但还应该有一个主机实现来执行相同的处理,以进行验证。)
该程序基本上是这样做的(不是实际的源代码):
void* buffer = allocate_buffer(); // properly aligned buffer
static_assert(sizeof(std::int32_t) == sizeof(float), "must have same size");
const std::int32_t* in = reinterpret_cast<const std::int32_t*>(buffer);
float* out = reinterpret_cast<float*>(buffer);
for(int i = 0; i < num_items; ++i)
out[i] = transform(in[i]);
有没有办法使reinterpret_cast
在 C++ 标准中定义良好的指针情况,无需对整个缓冲区进行额外的内存副本,或对每个元素进行额外的副本(例如std::bit_cast
)?
尽管我一直希望有一个好的方法,但目前还没有。你将不得不使用no-strict-aliasing
您选择的编译器的标志。
For std::bit_cast
你必须等到C++20
。不使用就没有标准的符合方法memcpy
据我所知。
也看看这个位播提案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html and 这个网站 http://www.forwardscattering.org/post/27.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)