将整数视为更小整数的数组是否属于未定义行为(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
相关产品推荐
相关产品推荐

