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

tml*_*len 10 c++ strict-aliasing c++11 c++14

根据标准,在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]);
Run Code Online (Sandbox Code Playgroud)

有没有办法reinterpret_cast在C++标准中明确定义指针大小写,而不需要为整个缓冲区做额外的内存副本,或者额外的每个元素副本(例如std::bit_cast)?

use*_*999 6

即使我希望所有的时间都有一个很好的方式,目前还有非.您将必须使用no-strict-aliasing您选择的编译器的标志.

因为std::bit_cast你必须等到C++20.memcpy据我所知,没有使用标准的符合方式.

另请查看此bit_cast提案本网站.