c++ - 缓冲区填充了不同类型的数据,以及严格的别名
问题描述
根据标准,在 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
您选择的编译器的标志。
因为std::bit_cast
你将不得不等到C++20
。memcpy
据我所知,没有使用没有标准的符合方式。
也看看这个bit_cast 提案和这个网站。
推荐阅读
- php - 在 laravel 中使用日期格式的正确方法
- javascript - 如何获取 JavaScript Socket.IO 版本?
- ios - 是否有等效于 WKInterfaceController 的 .becomeCurrentPage 方法的 SwiftUI?
- android - Android Kotlin:智能转换为“TextView”是不可能的,因为“x”是一个具有开放或自定义 getter 的属性
- sycl - queue.wait() 和等待缓冲区销毁有什么区别
- python - Python:在 Mac 上安装包
- asp.net-core-webapi - 响应缓存不适用于 Identity Server 4
- javascript - 反应 onKeyPress 渲染问题
- python - 为什么 Opencv/Hough 变换找不到整行?
- php - 如何解决 PHP 8.x 中关于 NumberFormatter 的新错误/行为变化?