reinterpret_cast 和 uint8_t 是否违反严格的别名规则?

Does reinterpret_cast with uint8_t break the Strict Aliasing Rule?

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

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),我认为是非法的。

我说得对吗?

However, in the above code we use a pointer of a non-character type (float*) to read or write data of (probably) a character type (uint8_t), which I think is illegal.

Am I correct?

是的。

Is the following code legal in terms of the Strict Aliasing Rule (and in general)?

没有


除了指针别名外,另一个考虑是float的对齐要求比uint8_t更严格。有疑问 uint8_t* allocateBuffer(arg) returns 是否满足 float.

对齐的指针