缓冲区填充不同类型的数据,并且严格别名

2024-02-26

根据标准 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(使用前将#替换为@)

缓冲区填充不同类型的数据,并且严格别名 的相关文章

随机推荐