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
.
对齐的指针
根据严格别名规则(一般而言),以下代码是否合法?
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
.