c++ - 带有 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
。
推荐阅读
- php - 我们可以仅使用“站点”和“主题”文件夹重新创建 Drupal 网站吗?
- sql-server - 使用 COUNT SQL Server 过滤表
- go - SSH 连接的操作超时
- spring - 使用片段 thymeleaf 以模态填充表单的数据
- json - 如何使用 Microsoft Graph API 获得完整响应或设置分页?
- r - 查找大于 r 中特定频率的特定值的数量
- command - 如何将 IP 查找命令添加到 discord.js 机器人
- html - 根据内容的大小扩展文本区域
- javascript - 发送/解释从 Javascript 发送到 Python 的 JSON 的问题
- angularjs - 如何从不同的页面角度检索数据