【发布时间】:2018-09-05 22:49:28
【问题描述】:
我使用STB 库将图像加载到内存中。具体函数stbi_load返回一个指向unsigned char的指针,这是一个数组。
我很想对原始数据使用新的 C++17 API,std::byte,这将使我更具表现力,让我可以逐个像素地为原始数据设置别名,或者通过投射来逐个颜色地为原始数据设置别名它到不同的数据类型(不同大小的整数)。
现在我尝试了这个:
std::unique_ptr<std::byte[], stbi_deleter>(stbi_load(...));
当然因为没有隐式转换所以没用。
然后我尝试了:
std::unique_ptr<std::byte[], stbi_deleter>(
static_cast<std::byte*>(stbi_load(...))
);
再次,它仍然没有工作。我不得不决定改用reinterpret_cast。让我质疑这种转换是否合法。我可以合法地将unsigned char* 转换为std::byte*根据严格的别名规则吗?然后我可以将数据转换为另一种数据类型,如std::uint32_t* 并对其进行变异吗?这也会打破别名规则吗?
【问题讨论】:
-
我还没有看到任何适用于 std::byte 的实用程序。有没有人有一个很好的例子来说明它可能有用的地方?
-
> “这将使我更有表现力,并让我逐个像素地为原始数据起别名。”我很确定那仍然是UB。 to_integer() 基本上只是 memcpy 的一个包装器。
-
请注意,
unsigned char数组已经非常适合逐像素访问数据。 (不确定你所说的“别名”是什么意思)。std::byte的优势在于减少您在某些类型的算术中意外使用它的可能性,并且正如您所提到的,更清楚地表达了数据的性质。 -
@NeilButterworth 我认为与使用
unsigned char相比,它的主要目的是禁用隐式转换 -
@NeilButterworth 它的用处很薄但不缺;即使只是查看流式传输(与使用语义重载
char时所需的体操相比)本身就是一个好处。可以说。我想说这主要是一个自我记录的事情。
标签: c++ casting bytebuffer strict-aliasing