首页 > 解决方案 > 带有 uint8_t 的 reinterpret_cast 是否违反了严格的别名规则?

问题描述

就严格别名规则(以及一般而言)而言,以下代码是否合法?

const int size = 1024;
uint8_t* buffer = allocateBuffer(size);
float* float_pointer = reinterpret_cast<float*>(buffer);
std::fill(float_pointer, float_pointer + size / sizeof(float), 1.5f);

据我了解,一般来说 SAR 表示我们无法通过不同类型的指针访问(读取或写入)数据 - 除非我们使用字符类型的指针。

但是,在上面的代码中,我们使用非字符类型 ( float*) 的指针来读取或写入(可能)字符类型 ( uint8_t) 的数据,我认为这是非法的。

我对么?

标签: c++c++14strict-aliasing

解决方案


但是,在上面的代码中,我们使用非字符类型(float*)的指针来读取或写入(可能)字符类型(uint8_t)的数据,我认为这是非法的。

我对么?

是的。

就严格别名规则(以及一般而言)而言,以下代码是否合法?

不。


除了指针别名之外,另一个考虑因素是 的对齐要求float比 的 更严格uint8_tuint8_t* allocateBuffer(arg)是否返回满足对齐的指针存在疑问float


推荐阅读