存储数组索引时为避免类型提升影响性能应如何选择数据类型?
性能与存储空间选择建议
关于是否需要改用unsigned int避免类型提升
- 首先明确结论:正常优化级别下(
-O2及以上),不需要切换为unsigned int,unsigned short的类型提升不会产生额外运行时开销。
现代CPU架构(x86、ARM等)加载16位无符号整数到通用寄存器时,会直接在加载指令中完成零扩展到32/64位的操作,这个过程和加载32位整数的指令周期完全一致,没有额外性能损耗。 - 超大型数组场景下,
unsigned short的性能反而会优于unsigned int:
相同元素数量下,unsigned short数组占用的内存仅为unsigned int数组的50%,能大幅提升CPU缓存命中率,缓存未命中带来的性能损失远大于理论上的类型提升开销,这一点在数组长度超过10万级时会非常明显。 - 只有在极其少见的古董级不支持窄类型加载扩展的架构上,才会出现类型提升的额外开销,这类场景当前几乎不存在。如果对性能有极致要求,可以直接查看编译生成的汇编代码确认加载逻辑是否为单指令实现。
索引类型选择建议
数组下标对应的标准类型是size_t,这是C标准定义的、与架构地址宽度匹配的无符号整数类型,专门用于表示内存对象大小、数组索引,不会出现寻址溢出问题。
你的场景中索引最大值仅为0xFFFF(65535),远小于所有主流架构size_t的取值范围,存储时用unsigned short完全合规,使用时编译器会自动将值提升为size_t参与寻址,不需要特意将存储类型改为size_t,否则会造成3~4倍的存储空间浪费,反而降低缓存命中率影响性能。
内容的提问来源于stack exchange,提问作者user3600124
相关产品推荐
相关产品推荐

