使用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)的数据,我认为这是非法的。

我正确吗?

解决方法

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

我正确吗?

是的

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

否。


除指针别名外,另一个考虑因素是float的对齐要求比uint8_t的对齐要求更严格。怀疑uint8_t* allocateBuffer(arg)是否返回满足float对齐方式的指针。