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)?
即使我希望所有的时间都有一个很好的方式,目前还有非.您将必须使用no-strict-aliasing您选择的编译器的标志.
因为std::bit_cast你必须等到C++20.memcpy据我所知,没有使用标准的符合方式.
另请查看此bit_cast提案和本网站.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           384 次  |  
        
|   最近记录:  |