You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将整数视为更小整数的数组是否属于未定义行为(UB)?

将整数视为更小整数数组的未定义行为分析

针对你提出的问题和给出的代码,分两种情况分析:

1. sort_bytes函数:无未定义行为

C++标准明确允许使用字符类型(包括std::uint8_t)的指针访问任何对象的存储字节。将std::uint32_t的地址转换为std::uint8_t*后,访问这4个字节属于合法的对象存储检查与修改操作。std::sort对这4个uint8_t元素排序,本质是修改原uint32_t对象的字节表示,完全符合标准要求,不存在未定义行为。

2. sort_words函数:存在未定义行为

这段代码违反了C++的严格别名规则。该规则规定:除非使用字符类型,否则不能通过不同类型的指针访问或修改一个对象。这里将std::uint32_t的地址转换为std::uint16_t*,并通过这个指针调用std::sort修改对象,属于用非字符类型的别名访问原对象,直接触发未定义行为。

即使目标平台上std::uint32_t的大小恰好是两个std::uint16_t,且内存对齐要求完全兼容,严格别名规则依然禁止这种操作——编译器会基于“不同类型指针不会指向同一对象”的假设做优化,违反规则可能导致生成的代码逻辑完全不符合预期。

总结

  • 用字符类型(uint8_t、char等)访问任意对象的字节是合法操作,无未定义行为;
  • 用非字符类型的更小整数类型访问原整数对象,违反严格别名规则,属于未定义行为。

内容的提问来源于stack exchange,提问作者MWB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:32:20